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
根据上述推导,得到ƒ的范围。代码中,我们每次枚举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 ; }


浙公网安备 33010602011771号