2025-10-23模拟赛总结
前言
666之前连续萎亖次差点亖了
终于发力了一次了好吧😎
成绩
虽然不知道为什么 T2 挂了
A
还是一如既往的有一道签到题好吧,而且是原题😂貌似在遥远的两年前考过
直接递归转移,设
设
- 将
s[l, m] 变为cc \cdots c ,将s[m + 1, r] 变为c + 1 好串,即w + S(m + 1, r, c + 1) 。 - 将
s[l, m] 变为c + 1 好串,将s[m + 1, r] 变为cc \cdots c ,即S(l, m, c + 1) + w 。
因为每次除以二,所以类似线段树结构,递归一共
于是就愉快的 AC 了😚
恭喜可爱的 lzh 同学写了一大堆神秘贪心,成为班上唯一一个没有通过 T1 的人👏
::::success[代码]
#include <bits/stdc++.h>
using namespace std;
int n, v[1 << 18][26];
string s;
int S(int l, int r, int c) {
if (l == r) return s[l] - 'a' != c;
int m = l + r >> 1;
int a = m - l + 1 - (v[m][c] - v[l - 1][c]) + S(m + 1, r, c + 1);
int b = S(l, m, c + 1) + r - (m + 1) + 1 - (v[r][c] - v[m][c]);
return min(a, b);
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> s, s = " " + s;
for (int i = 1; i <= n; i++)
for (int j = 0; j < 26; j++)
v[i][j] = v[i - 1][j] + (s[i] - 'a' == j);
cout << S(1, n, 0);
return 0;
}
::::
B
题意极其难以理解,样例极其不为严谨😠
甚至样例解释只发到了 QQ 群中😡 要不是上课水 QQ 就看不到样例解释了
::::
唉……要是 T2 过了就
C
最开始脑抽了,只想到了
突然又发现当
哈哈,前
比赛最后 我还以为能过呢
事实证明有很大作用,直接
::::success[代码]
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, M = 5e3;
int n, m, q, a[N], p[N], c[M][M];
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a[i], i >= a[i] && (p[++m] = i);
fill(c[0], c[0] + M * M, -1);
for (int l, r; q; q--) {
cin >> l >> r;
if (l < M && r < M && ~c[l][r]) {
cout << c[l][r] << "\n";
} else {
int x = lower_bound(p + 1, p + m + 1, l + 1) - p;
int y = upper_bound(p + 1, p + m + 1, n - r) - p - 1;
int s = 0;
for (int i = x; i <= y; i++) p[i] >= a[p[i]] && (s += (p[i] - a[p[i]] <= s));
l < M && r < M && (c[l][r] = s);
cout << s << "\n";
}
}
return 0;
}
::::
最后发现我是唐氏,这就是责任人题啊,直接线段树二分(或树状数组),随便统计答案啊。痛失
还是得嘲讽一下 lzh 的 freopen("array3.in", "r", stdin) 好吧😆😆😆
D
可惜了,没写基环树的暴力分,明明那么简单😌
当
基环树的做法更无脑,可惜太懒了😴,没写😯 直接找出基环树中的那个环,判断一下是否包括所有边不就可以了,我是责任人,明明比
甚至暴力+基环树有惊人的
::::success[代码(只有暴力)]
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int t, n, m, c[N];
array<int, 3> z[N];
int main() {
cin.tie(0)->sync_with_stdio(0);
for (cin >> t; t; t--) {
cin >> n >> m;
for (int i = 0; i < m; i++)
cin >> z[i][0] >> z[i][1] >> z[i][2];
bool q = 0;
for (int i = 0; i < (1 << m) && !q; i++) {
bool l = 1;
fill(c + 1, c + n + 1, 0);
for (int j = 0; j < m; j++) {
auto [u, v, k] = z[j];
k && (l &= (i >> j) & 1), (i >> j) & 1 && (c[u]++, c[v]++);
}
if (l) {
for (int j = l = 1; j <= n; j++) l &= !(c[j] % 2);
q |= l;
}
}
cout << (q ? "Yes" : "No") << "\n";
}
return 0;
}
::::
其实正解也不算特别难,可以直接缩点然后跑欧拉回路。顺带膜拜一下初一巨佬 syc 场切 T4 orz %%%
后记
又是原题大赛,四道全是 CF 的(话说既然有原题狗狗怎么都没做出 CD,deepseek 太菜了🤨)
xbt 再次 AK 虐全场,还是太超标了 nerf when 🤕
经过两小时终于肝完总结,求赞😻