AtCoder Beginner Contest 428

   C - Brackets Stack Query

段代码的功能是处理一系列关于括号序列的操作(添加或删除括号),并在每次操作后判断当前的括号序列是否为有效的括号序列

我们可以用cnt记录左括号右括号数量是否匹配,若为左括号cnt++,若为右括号cnt--,同时用flag记录每次操作后得到的字符串是否合法(每个左括号对应一个右括号),当flag为0,并且cnt为0时,满足条件,输出“Yes”,否则输出“No”

查看代码
void solve(){
    int q;
    cin >> q;
    vector<char> s(q + 1);
    int n = 0;
    int cnt = 0;
    int flag = 0;
    int k; char c;
    while(q--){
        cin >> k;
        if(k == 1){
            cin >> c;
            s[++n] = c;
            if(c == '(') cnt++;
            else cnt--;
            if(cnt < 0) flag++;
        }else{
            if(cnt < 0) flag--;
            if(s[n] == '(') cnt--;
            else cnt++;
            n--;
        }

        if(!flag && !cnt){
            cout << "Yes" << endl;
        }else {
            cout << "No" << endl;
        }
    }   
    return ;
}

D - 183184

      image

根据上述推导,得到ƒ的范围。代码中,我们每次枚举d,通过sqrt得到区间中存在平方数的个数,最后得到答案

查看代码
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
#define int long long

int f(int x){
    int t = (int)sqrtl(x);
    //while(t * t > x) t--;
    //while((t + 1) * (t + 1) <= x) t++;
    return t;
}

void solve(){
    int c ,d;
    cin >> c >> d;
    int ans = 0;
    for(int i = 1, j = 10; i <= 10; i++, j *= 10){
        int l = max(1ll, 1ll * j / 10 - c);
        int r = min(d * 1ll, 1ll * j - 1 - c);
        if(l > r) continue;
        ans += f(j * c + c + r) - f(j * c + c + l - 1);
    }
    cout << ans << endl;
    return ;
}

signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    int T;
    cin >> T;
    while(T--){
        solve();
    }
    return 0;
}

E - Farthest Vertex

题目要求输出每个顶点距离最大的节点编号 ,问题就转化为求树的直径,求树的直径,通过两次dfs求解
https://oi-wiki.org/graph/tree-diameter/
得到两个节点a, b。分别用dfs求每个节点到a节点和b节点的距离,选取距离最远的,输出答案。
查看代码
void solve(){
    int n;
    cin >> n;
    int u, v;
    vector<vector<int>> G(n + 1);
    for(int i = 1; i < n; ++i){
        cin >> u >> v;
        G[u].emplace_back(v);
        G[v].emplace_back(u);
    }

    vector<int> dis(n + 1, 0); 
    auto dfs = [&](auto&& self, int u, int cur) -> void{
        for(auto v : G[u]){
            if(v == cur) continue;
            dis[v] = dis[u] + 1;
            self(self, v, u);
        }
    };

    dis[1] = 0;
    dfs(dfs, 1, 0);

    int a = 0;
    for(int i = 1; i <= n; ++i){
        if(dis[i] >= dis[a]) a = i; 
    }

    for(int i = 0; i <= n; ++i) dis[i] = 0;
    dis[a] = 0;
    dfs(dfs, a, 0);
    auto disa = dis;

    int b = 0;
    for(int i = 1; i <= n; ++i){
        if(dis[i] >= dis[b]) b = i;
    }

    for(int i = 0; i <= n; ++i) dis[i] = 0;
    dis[b] = 0;
    dfs(dfs, b, 0);

    for(int i = 1; i <= n; ++i){
        if(disa[i] > dis[i]){
            cout << a << endl;
        }else if(disa[i] < dis[i]){
            cout << b << endl;
        }else{
            cout << max(a, b) << endl;
        }
    }
    return ;
}
posted @ 2025-11-02 22:55  菜鸡の编程日常  阅读(5)  评论(0)    收藏  举报