小模拟,根据题意模拟输出
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; char mp[100][100]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for (int i = 1; i <= 4 * n + 5; i++) { if (i == 1 || i == 4 * n + 5) { for (int j = 1; j <= 13 * n + 19; j++) { mp[i][j] = '*'; } } else if (i > 1 && i <= 1 + n) { mp[i][1] = '*'; mp[i][13 * n + 19] = '*'; for (int j = 2; j <= 13 * n + 18; j++) { mp[i][j] = '.'; } } else if (i < 4 * n + 5 && i >= 3 * n + 5) { mp[i][1] = '*'; mp[i][13 * n + 19] = '*'; for (int j = 2; j <= 13 * n + 18; j++) { mp[i][j] = '.'; } } else { mp[i][1] = '*'; mp[i][13 * n + 19] = '*'; if (i == n + 2) { for (int j = 2; j <= 13 * n + 18; j++) { if ((j >= 2 && j <= n + 2) || (j >= 3 * n + 6 && j <= 4 * n + 6) || (j >= 6 * n + 10 && j <= 7 * n + 10) || (j >= 9 * n + 14 && j <= 10 * n + 14) || (j >= 12 * n + 18 && j <= 13 * n + 18)) { mp[i][j] = '.'; } else if (j > n + 2 && j < 3 * n + 6) { if (j == n + 3 || j == 3 * n + 5) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 4 * n + 6 && j < 6 * n + 10) { mp[i][j] = '@'; } else if (j > 7 * n + 10 && j < 9 * n + 14) { if (j == 7 * n + 11) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 10 * n + 14 && j < 12 * n + 18) { mp[i][j] = '@'; } } } else if (i > n + 2 && i < 3 * n + 4) { int mid = 2 * n + 3; for (int j = 2; j <= 13 * n + 18; j++) { if ((j >= 2 && j <= n + 2) || (j >= 3 * n + 6 && j <= 4 * n + 6) || (j >= 6 * n + 10 && j <= 7 * n + 10) || (j >= 9 * n + 14 && j <= 10 * n + 14) || (j >= 12 * n + 18 && j <= 13 * n + 18)) { mp[i][j] = '.'; } if (i == mid) { if (j > n + 2 && j < 3 * n + 6) { if (j == n + 3 || j == 3 * n + 5) { mp[i][j] = '@'; } else if (j == 2 * n + 4) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 4 * n + 6 && j < 6 * n + 10) { mp[i][j] = '@'; } else if (j > 7 * n + 10 && j < 9 * n + 14) { if (j == 7 * n + 11) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 10 * n + 14 && j < 12 * n + 18) { mp[i][j] = '@'; } } else if (i < mid) { if (j > n + 2 && j < 3 * n + 6) { int x = i - n - 2; if (j == n + 3 || j == 3 * n + 5) { mp[i][j] = '@'; } else if (j == n + 3 + x) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 4 * n + 6 && j < 6 * n + 10) { if (j == 4 * n + 7) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 7 * n + 10 && j < 9 * n + 14) { if (j == 7 * n + 11) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 10 * n + 14 && j < 12 * n + 18) { if (j == 10 * n + 15) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } } else if (i > mid) { if (j > n + 2 && j < 3 * n + 6) { int x = i - n - 2; if (j == n + 3 || j == 3 * n + 5) { mp[i][j] = '@'; } else if (j == n + 3 + x) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 4 * n + 6 && j < 6 * n + 10) { if (j == 4 * n + 7) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 7 * n + 10 && j < 9 * n + 14) { if (j == 7 * n + 11) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 10 * n + 14 && j < 12 * n + 18) { if (j == 12 * n + 17) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } } } } else if (i == 3 * n + 4) { for (int j = 2; j <= 13 * n + 18; j++) { if ((j >= 2 && j <= n + 2) || (j >= 3 * n + 6 && j <= 4 * n + 6) || (j >= 6 * n + 10 && j <= 7 * n + 10) || (j >= 9 * n + 14 && j <= 10 * n + 14) || (j >= 12 * n + 18 && j <= 13 * n + 18)) { mp[i][j] = '.'; } else if (j > n + 2 && j < 3 * n + 6) { if (j == n + 3 || j == 3 * n + 5) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 4 * n + 6 && j < 6 * n + 10) { if (j == 4 * n + 7) { mp[i][j] = '@'; } else { mp[i][j] = '.'; } } else if (j > 7 * n + 10 && j < 9 * n + 14) { mp[i][j] = '@'; } else if (j > 10 * n + 14 && j < 12 * n + 18) { mp[i][j] = '@'; } } } } } for (int i = 1; i <= 4 * n + 5; i++) { for (int j = 1; j <= 13 * n + 19; j++) { cout << mp[i][j]; if (j == 13 * n + 19) { cout << "\n"; } } } return 0; }
不难发现,每个操作同时做两次的话相当于没做,所以肯定是两个操作不断循环,才能产生不同的结果,可以推出式子,然后进行判断即可
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep(oo, 0, T) { int a, b, c, x; cin >> a >> b >> c >> x; int bb = a - b; if (c == x) { cout << "Yes\n"; continue; } if (bb == b) { if (c + x == b) { cout << "Yes\n"; } else { cout << "No\n"; } } else { if ((x + c - b) % (b - bb) == 0) { cout << "Yes\n"; } else if ((x + c - b) % (bb - b) == 0) { cout << "Yes\n"; } else if ((x - c) % (b - bb) == 0) { cout << "Yes\n"; } else if ((x - c) % (bb - b) == 0) { cout << "Yes\n"; } else { cout << "No\n"; } } } return 0; }
不会树剖、不会差分依然可以用类似树上差分的方式O(n)的时间过掉,当我们从根向下dfs时,每经过一个点都记录一下他能走到的最远的点,同时权值++,回溯时把权值都收起来,就是能到达该点的次数
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> G(n + 1); vector<int> ans(n + 1), d(n + 1), c, cnt(n + 1); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } for (int i = 1; i <= n; i++) { cin >> d[i]; } c.push_back(1); int len = 1; function<int(int, int)> dfs = [&](int x, int y) { int tmp = 1; int st = max(0, len - d[x] - 1); ans[c[st]]++; for (auto u : G[x]) { if (u != y) { c.push_back(u); len++; tmp += dfs(u, x); len--; c.pop_back(); } } cnt[x] = tmp; tmp -= ans[x]; ans[x] = 0; return tmp; }; dfs(1, 0); for (int i = 1; i <= n; i++) { cout << cnt[i] << " \n"[i == n]; } return 0; }
“蔚来杯“2022牛客暑期多校训练营6 G、J、B
最新推荐文章于 2024-10-06 10:17:48 发布
本文详细解析了两道算法竞赛题目,第一题涉及二维数组的填充规则,第二题探讨了如何通过数学推理判断操作序列是否可能。代码实现中使用了C++,并展示了如何巧妙地处理复杂条件。同时,文章还介绍了在树形结构问题上的优化算法,通过DFS实现高效求解。
摘要由CSDN通过智能技术生成