Codeforces Round #826 (Div. 3) A - E
A
照着题意
void solve() { string s1, s2; cin >> s1 >> s2; int n = sz(s1), m = sz(s2); if (s1 == s2) cout << '=' << endl; else { if (s1[n - 1] > s2[m - 1]) cout << '<' << endl; else if (s2[m - 1] > s1[n - 1]) cout << '>' << endl; else if (s1[n - 1] == 'S'){ if (n > m) cout << "<" <<endl; else if (n < m) cout << ">" << endl; else cout << "=\n"; } else if (s1[n - 1] == 'L'){ if (n > m) cout << ">" <<endl; else if (n < m) cout << "<" << endl; else cout << "=\n"; } } }
B
除
void solve() { int n; cin >> n; if (n == 3) cout << -1 << endl; else { int mid = n / 2 + 1; for (int i = mid;i <= n;i++) cout << i << ' '; for (int i = 1;i < mid;i++) cout << i << ' '; cout << endl; } }
C
可以枚举第一段的和为多少,然后双指针做后面的分段,时间复杂度
void solve() { int n; cin >> n; vector<int> a(n + 1), sum(n + 1); for (int i = 1;i <= n;i++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; } for (int len = 1;len <= n;len ++) { bool ok = false; for (int i = 1;i <= len;i++) { int res = sum[i]; for (int l = i + 1, r = i + 1;l <= n;l ++) { while (sum[r] - sum[l - 1] < res && r - l + 1 <= len) r ++; if (sum[r] - sum[l - 1] != res || r - l + 1 > len) break; else { l = r; r = r + 1; if (l == n) ok = true; } } if (ok) break; } if (ok) { cout << len << endl; return ; } } cout << n << endl; }
D
根据完全二叉树最后一层有
接下来从叶子结点向上遍历,记录左右子树的最大值和最小值,如果左子树的最大值大于右子树的最大值,则需要一次交换,且需要满足
也可以用线段树做,这里完全二叉树也可以看做是一颗线段树,做的过程就是用左右子树的信息更新父亲结点的信息,和线段树
#include <bits/stdc++.h> #define endl '\n' using namespace std; void solve() { int n, m; cin >> n; m = n * 2 - 1; vector<int> a(n + 1); for (int i = 1;i <= n;i++) cin >> a[i]; if (n == 1) { cout << 0 << endl; return; } bool ok = true; vector<int> g[m + 1], mx(m + 1), mi(m + 1), ans(m + 1); for (int i = m;i > 1;i--) { int p = i / 2; g[p].push_back(i); } //发现后面没有用到 function<void(int x)> dfs = [&](int x) { int l = x * 2, r = x * 2 + 1; if (r <= m) { dfs(l); dfs(r); ans[x] = ans[l] + ans[r]; mx[x] = max(mx[l], mx[r]); mi[x] = min(mi[l], mi[r]); if (mx[l] > mx[r] && mx[r] + 1 != mi[l]) ok = false; if (mi[r] < mi[l] && mx[r] + 1 != mi[l]) ok = false; if (mx[l] < mx[r] && mx[l] + 1 != mi[r]) ok = false; if (mi[l] == mx[r] + 1) ans[x] ++; } else mx[x] = mi[x] = a[x - n + 1]; }; dfs(1); if (!ok) cout << "-1\n"; else cout << ans[1] << endl; } signed main(void) { cin.tie(nullptr), cout.tie(nullptr) -> ios::sync_with_stdio(false); int t = 1; cin >> t; while (t --) solve(); return 0; }
E
不够分奴,想过是
记
对所有的
int dp[200010]; void solve() { int n; cin >> n; vector<int> a(n + 1), pre[n + 1]; memset(dp, 0, sizeof dp); for (int i = 1;i <= n;i++) cin >> a[i]; dp[0] = 1; for (int i = 1;i <= n;i++) { if (i - a[i] - 1 >= 0) dp[i] |= dp[i - a[i] - 1]; if (i + a[i] <= n) dp[i + a[i]] |= dp[i - 1]; } cout << (dp[n] == 1 ? "YES\n" : "NO\n"); }
F
待补
G
待补
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!