从初四到高二,键盘的敲击声成了青春的背景乐。有些路,走的时候觉得漫长,回头看,却已铺满成长的脚印。

DAY -1 —— 2025.10.31

上午大课间去地理组办公室找班主任请晚自习的假,收到了 zhuzhu 和 cuicui(参考文献:地理作业)的鼓励。

下午跑了个 800 居然用了 3:41,差点 s 过去。

大课间非常命苦地到处搜索周末试卷。

最后一节课去参加了一下技团会议,结束后就美美回家了。

回了家之后特别特别焦虑,本来打算看会儿《音乐缘计划》也没看,有一点点失眠快一点才睡着。

DAY 0 —— 2025.11.01

启程

7:20 左右到了学校门口,跑进学校拿水杯。

7:30 准时出发了,跟 ACE 大佬坐一块。

路上跟高一小登们一起玩了一会儿 UNO,连着两把吃了 +10 直接红温()

听着歌睡了一觉醒来后看 ACE 玩音游,太有实力了还是 /bx

约 11:30 到了考点,有点感慨,第三次,也是最后一次来到这里了。

大家一起去吃饭,我甚至还记得食堂怎么走hhhhh(地理生人肉导航这一块)。

吃了一份馄饨,几个人一起遛弯,散步到了去年 CSP 前一起踢石子的小湖边。

上了车看了看骗分导论,突然又很焦虑所以睡了一觉。

马上就要开考了有某位可怜小登发现拿成初赛的准考证了哈哈哈哈哈哈哈哈哈哈哈哈。(”你在这里干什么快去八中准备考试啊“

在通道外面排队,前面仍然人山人海,吐槽了一句我每年排队都是只能看见一堆人脑袋根本看不到前面的情况,然后 ACE 一把把我举起来跟我说这样就能看见了(感谢 ACE 老师让我感受了一下一米九的视角)。

到了考场后右边有个威海的妹妹主动跟我搭话,我问她是高中生吗,她说她刚上高一。

TBC:哦哦哦我高二。

妹妹:?????啊你居然高二吗我以为你是初中生。

TBC:……好的就当你夸我年轻了。

然后是每年的固定环节——监考给的密码漏了个字符(

开考后先打完了缺省源,之后就开始答题啦!!!

正式比赛

比赛过程(来源:本人赛时代码注释)

14:41 读完 T1 且有思路

14:58 写完代码但样例 1 没过

15:06 调过样例 1,是边界没处理好,样例 2 又没过……发现可能是清空没清空好

15:11 我是傻子,我 clear 函数没调用(

15:14 样例 3 居然单点了一个 0 ?!!破案了又忘记初始化数组大小了

15:16 样例 4 的第 4 组数据没过。。。

15:26 发现是忽略了两项甚至三项喜爱度同为最大值的情况,更改后通过样例 4

15:27 样例 5 顺利通过(此题真是每个样例都起到了它的作用)

15:32 读完 T2,这不就是 kruskal 板子吗?!!

15:41 写一半了感觉不太对劲。。。决定重构写特殊性质 A,感觉可以用并查集

15:43 刚删掉代码突然又有了正解思路。。。Ctrl+Z。。。

16:05 码完了,但 WA 样例 1

16:09 题面好阴间,发现样例里城市化改造后的 1 还要和自己建设一条道路

16:12 哦我去理解错题面了。。要重新理解了。。。跟去年的 T2 一样的题面抽象。。

16:26 决定改成朴素的 kruskal 先拿下特殊性质 A 和 k == 0 的 48pts

16:30 孩子们我没招了我修路花费的比答案少。。。

16:39 没输出了。。。

16:44 上了个厕所,吃了个薄荷糖,开始手搓样例

16:50 下标从 m 往后越界了。。现在应该没什么问题了

17:05 读完了 T3T4 都做了充足的思考之后,感觉 T4 正解是 dp,决定先写 T4

17:11 感觉有点卡壳,还是先写 T3 吧

17:12 推了一会儿 T4 的 dp 式子发现没什么思路,所以先来写 T3 的 特殊性质 B(整整 25pts!!!)

17:39 忘了怎么用 fc 了,人眼比对了一下几百行样例 4 应该过了,就当 25pts 到手了吧

17:40 T3 特殊性质 B 写完了,来到 T4 推式子

17:46 带的薄荷糖都吃完了(悲)

18:03 推正解的话时间来不及了,只能先推特殊性质了

18:15 推特殊性质 A 正解后发现自己读错题了,没看到 “被拒绝或放弃”,没时间了没时间了好慌

18:22 写了一个 n==m 的特殊情况,4 分也是分

18:27 又写了一个 m==1 的特殊情况,但是没调过样例 4,没时间了真的没时间了。。。

T1

预期分数:100pts

实际分数:100pts

代码思路:很简单的一个贪心

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
const int N = 1e5 + 29;

int n, m;
int d[N];
vector<int> a, b, c;
priority_queue<int, vector<int>, greater<int> > q;

void tbcclear() {
a.clear();
b.clear();
c.clear();
rep (i, 1, n) d[i] = 0;
while (q.size()) q.pop();
}

void tbcsolve() {
cin >> n;
tbcclear();
int cnt1 = 0, cnt2 = 0, cnt3 = 0, ans = 0;
rep (i, 1, n) {
int x, y, z;
cin >> x >> y >> z;
if (x >= y && x >= z) { // 如果对第一个部门最满意的话
cnt1++; // 加入第一个部门的人数 +1
ans += x; // 将该满意度加进答案里
a.pb(i); // 记录目前在第一个部门的人员
if (y > z) d[i] = x - y; // 记录第 i 个人最大满意度和次大满意度的差值
else d[i] = x - z;
}
else if (y >= x && y >= z) {
cnt2++;
ans += y;
b.pb(i);
if (x > z) d[i] = y - x;
else d[i] = y - z;
}
else {
cnt3++;
ans += z;
c.pb(i);
if (x > y) d[i] = z - x;
else d[i] = z - y;
}
}
int maxn = max({cnt1, cnt2, cnt3});
if (maxn <= (n >> 1)) { // 如果人数都没有超过 n/2 的话直接输出答案
cout << ans << '\n';
return;
}
if (cnt1 == maxn) {
for (auto i : a) q.push(d[i]); // 把人数超了的部门的人的满意度差值扔进小顶堆里
while (cnt1 > (n >> 1)) { // 重复调整人员直到人数不大于 n/2
ans -= q.top(); // 用答案减去这个差值
q.pop();
cnt1--;
}
}
else if (cnt2 == maxn) {
for (auto i : b) q.push(d[i]);
while (cnt2 > (n >> 1)) {
ans -= q.top();
q.pop();
cnt2--;
}
}
else {
for (auto i : c) q.push(d[i]);
while (cnt3 > (n >> 1)) {
ans -= q.top();
q.pop();
cnt3--;
}
}
cout << ans << '\n';
}

T2

预期分数:48ptsk==0 和特殊性质 A)

实际分数:48pts

代码思路:Kruskal 板子 (非常平平无奇的板子所以就不写注释了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
const int N = 1e4 + 29;
const int M = 2e6 + 29;

int n, m, k, ans, tot;
int a[N], fa[N];
struct node {
int a, b, w;
} e[M];

bool cmp(node x, node y) {
return x.w < y.w;
}

int find(int x) {
return x == fa[x] ? x : fa[x] = find(fa[x]);
}

void merge(int x, int y) {
int fx = find(x), fy = find(y);
fa[fy] = fx;
}

void tbcsolve() {
cin >> n >> m >> k;
rep (i, 1, m) cin >> e[i].a >> e[i].b >> e[i].w;
int cnt = m;
rep (i, n + 1, n + k) {
int c; cin >> c;
rep (j, 1, n) {
cin >> e[++cnt].w;
e[cnt].a = j;
e[cnt].b = i;
}
}
n += k;
sort(e + 1, e + 1 + cnt, cmp);
rep (i, 1, n) fa[i] = i;
rep (i, 1, cnt) {
int u = e[i].a, v = e[i].b, w = e[i].w;
if (find(u) == find(v)) continue;
merge(u, v);
ans += w;
if (++tot >= n - 1) break;
}
cout << ans << '\n';
}

T3

预期分数:25pts (特殊性质 B)

实际分数:5pts (TLE 了)

代码思路:判断 st 前后 b 的位置变化以及前后 a 的个数来判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
const int N = 2e5 + 29;

int n, q;
struct node {
bool lr; // 记录 b 是向左移动还是向右移动,向左为 0 向右为 1
int d; // 前后 b 的移动距离
int left; // 左边的 b 左边 a 的个数
int right; // 右边的 b 右边 a 的个数
} a[N];
vector<int> l, r;

void tbcsolve() {
cin >> n >> q;
rep (i, 1, n) {
string s1, s2;
cin >> s1 >> s2;
int len = s1.size();
int pos1, pos2; // 记录两个字符串里 b 的位置
rep (j, 0, len - 1) if(s1[j] == 'b') pos1 = j;
rep (j, 0, len - 1) if(s2[j] == 'b') pos2 = j;
if (pos1 < pos2) {
a[i] = {1, pos2 - pos1, pos1, len - 1 - pos2}; // 这个自己写一下结合结构体的注释就能理解了
r.pb(i);
}
else {
a[i] = {0, pos1 - pos2, pos2, len - 1 - pos1};
l.pb(i);
}
}
while (q--) {
string t1, t2;
cin >> t1 >> t2;
int len = t1.size();
int pos1, pos2;
rep (j, 0, len - 1) if(t1[j] == 'b') pos1 = j;
rep (j, 0, len - 1) if(t2[j] == 'b') pos2 = j;
int ans = 0;
if (pos1 < pos2) {
for (auto i : r) {
// 如果 b 的移动距离一样且左右 a 的个数比选中的 s 中的个数要多说明可以使用
if (a[i].d == pos2 - pos1 && a[i].left <= pos1 && a[i].right <= len - 1 - pos2) ans++;
}
}
else {
for (auto i : l) {
if (a[i].d == pos1 - pos2 && a[i].left <= pos2 && a[i].right <= len - 1 - pos1) ans++;
}
}
cout << ans << '\n';
}
}

T4

预期得分:4pts

实际得分:4pts

代码思路:特判 n==ms 中全为 0 且 c 中无 0 (其实是想推特殊性质的式子的但是实在没时间了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const int N = 500 + 29;
const int mod = 998244353;

int n, m;
int c[N];
string s;

bool judgeA() {
for (auto i : s) if (i == '0') return false;
return true;
}
bool judge0() {
rep (i, 1, n) if (c[i] == 0) return false;
return true;
}
int all(int x) {
int res = 1;
rep (i, 2, x) res = (res * i) % mod;
return res;
}

void tbcsolve() {
cin >> n >> m;
cin >> s;
rep (i, 1, n) cin >> c[i];
if (m == n) {
if (!judgeA() || !judge0()) {
cout << 0 << '\n';
return;
}
cout << all(n) << '\n';
return;
}
}

预期总得分:100 + 48 + 25 + 4 = 177pts

如果不挂分的话这个成绩我真的已经特别特别满意了😭

返程

出了考场第一件事情当然是抄起手机来开始吐槽怎么会有人这样面试招人(

仍然挤了很久。

上了车发现车上大家都有晚饭吃我没饭。(真的好饿)

人齐了接着就出发了。

和大家玩了一会儿信息学竞赛主题的你画我猜,实在是太累了就睡觉了(其实也没睡多久主要是在 WeChat 跟朋友聊天)

大约 11:30 到了学校门口,妈妈接我回家~

到家之后很累很困很饿接着就睡觉了,很久没有这么早睡了……

DAY 1 —— 2025.11.02

早上 6:30 起床,躺在床上玩了两个小时手机。

九点左右仍然是跟 Y_1r 自习去了,但是学不动 whk,抱着干儿子亲。

去零食店批发了好多好吃的零食!!!

送去装骨的孩子也到家了去接孩子回家嘻嘻嘻嘻。

到家之后发现云斗发了民间评测,赶紧翻出自己的准考证号去查了一下成绩,直接震惊了我:

不仅没有挂分,而且 T3 还比我预期的多骗了 5pts (真的超级超级开心!!)

是真的真的最近一直专注 whk 没怎么写代码所以超乎意料。

期待 CCF 出分!!!(我也能有蓝勾了wwww好开心)

DAY 3 —— 2025.11.04

发现洛谷和小图灵的 T3 都挂成 5pts 了……不妙,好像是后面的特殊性质都超时了。😭

DAY 5 —— 2025.11.06

今天出了初评分数。

100 + 48 + 5 + 4 = 157

T3 TLE 挂了 20 分,其实是有些遗憾的。

整体来说还算是比较满意,目前期中考试(11.17)之前会集中先学 whk,等期中考试结束后会停课冲刺 NOIP。

期待 NOIP!!

祝我以及看到这篇题解将要打 NOIP 的你,RP += INF