Codeforces Global Round 26 (A - E)
Codeforces Global Round 26
A#
如果
如果
void solve() {
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> a[i];
if(a[1] == a[n]) {
cout << "NO\n";
return;
}
cout << "YES\n";
if(a[2] != a[n]) {
cout << "R";
for(int i = 2; i <= n; ++ i) {
cout << "B";
}
cout << '\n';
return;
}
cout << "RR";
for(int i = 3; i <= n; ++ i) {
cout << "B";
}
cout << '\n';
}
B#
如果首位不等于
否则可以推出两个数
例如:
。 (一定有进位)。 。
以此类推。
void solve() {
ll x; cin >> x;
auto s = to_string(x);
int n = s.length();
if(s[0] != '1') {
cout << "NO\n";
return;
}
for(int i = 0; i <= n - 2; ++ i) {
int x = 10 + s[i + 1] - '0';
if(i != n - 2) -- x;
if(x < 10 || x > 18) {
cout << "NO\n";
return;
}
}
cout << "YES\n";
}
C1#
最多只会用一次操作二。
反证法,考虑最后两次操作二分别对应
维护最小前缀和
void solve() {
ll n, mi = 0, s = 0;
cin >> n;
for(int i = 1; i <= n; ++ i) {
int x; cin >> x;
mi = min(mi, s += x);
}
cout << s - mi * 2 << '\n';
}
C2#
延续 C1 的思考方向。
如果
如果
记
void solve() {
cin >> n;
mi = 0;
for(int i = 1; i <= n; ++ i) {
cin >> s[i];
mi = min(mi, s[i] += s[i - 1]);
}
if(mi == 0) {
cout << p[n] << '\n';
return;
}
ll ans = 0;
for(int i = 1, k = 0; i <= n; ++ i) {
if(s[i] >= 0) ++ k;
if(s[i] == mi) {
ans = (ans + p[k] * p[n - i]) % P;
}
}
cout << ans << '\n';
}
D#
设 a
的情况,共
设 a
字符的数量为
如果 a
字符,把 a
后,原串里一定恰好存在
枚举 a
字符的位置为
把 a
个数
设 a
个数
void solve() {
string s;
cin >> s;
int n = s.length();
if(count(s.begin(), s.end(), 'a') == n) {
cout << n - 1 << '\n';
return;
}
vector<int> a;
for(int i = 0; i < n; ++ i) {
if(s[i] != 'a') {
a.eb(i);
}
}
int m = a.size();
ll ans = 0;
for(int i = 1; i <= m; ++ i) {
if(m % i) {
continue;
}
int ok = 1;
for(int j = i; j < m; ++ j) {
int o = j % i;
if(s[a[j]] != s[a[o]] || (o && a[o] - a[o - 1] != a[j] - a[j - 1])) {
ok = 0;
break;
}
}
if(ok) {
int mi = n;
for(int j = i; j < m; j += i) {
mi = min(mi, a[j] - a[j - 1] - 1);
}
int r = n - a.back() - 1;
for(int l = 0; l <= a[0]; ++ l) {
ans += max(0, min(r + 1, mi - l + 1));
}
}
}
cout << ans << '\n';
}
E#
把一个点的父亲儿子都加到
所有的叶子构成一个独立集,我们找去除根后最大的,类似 上司的舞会。
枚举每个节点作为初始的根,换根 dp。如果根本身就是叶子还要在加一。
具体来说,第一次扫描以
第二次扫描求出
用
void solve() {
int n;
cin >> n;
vector<vector<int>> g(n + 1);
for(int i = 1; i < n; ++ i) {
int x, y;
cin >> x >> y;
g[x].eb(y);
g[y].eb(x);
}
vector<array<int, 2>> f(n + 1, {0, 0});
auto dfs = [&](auto &&dfs, int x, int fa) -> void {
f[x][0] = 0;
f[x][1] = 1;
for(int y : g[x]) {
if(y != fa) {
dfs(dfs, y, x);
f[x][0] += max(f[y][0], f[y][1]);
f[x][1] += f[y][0];
}
}
};
dfs(dfs, 1, 0);
vector<array<int, 2>> h(n + 1);
h[1][0] = f[1][0];
h[1][1] = f[1][1];
int ans = h[1][0] + (g[1].size() == 1);
auto dfs2 = [&](auto &&dfs2, int x, int fa) -> void {
int tmp = h[fa][0] - max(f[x][0], f[x][1]);
h[x][1] = f[x][1] + tmp;
h[x][0] = max(h[fa][1], f[x][0] + tmp);
tmp = h[x][0] + (g[x].size() == 1);
ans = max(ans, tmp);
for(int y : g[x]) {
if(y != fa) {
dfs2(dfs2, y, x);
}
}
};
for(int y : g[1]) {
dfs2(dfs2, y, 1);
}
cout << ans << '\n';
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧