• 分享
  • 专题:考场策略与时间分配(CSP 复赛)

  • @ 2026-9-23 18:02:47

几个小时里,你该把这些本事花在哪。

前置:本讲面向已经学完 basic / ds / dp / graph 主干、正在准备复赛的学生。

适合对象:保J 一等 / 冲 S 一等。

1. 分数线的真相

1.1 先把规则摆出来

真实赛制:CSP 复赛(第二轮)四道题,每题 100 分,满分 400,时长 3.5~4 小时(近年 J 组 3.5 小时、S 组 4 小时,以当年通知为准)。

评级走的是全国认证基准线 + 各省调整。《CSP-J/S 2025 第二轮评级规则》给出的全国基准线是:

一等 二等 三等
入门级 CSP-J 255 205 130
提高级 CSP-S 131 60 30
  • 本省一等线达到全国基准线的省份,才可以设三等。 一等线低于全国基准的省份不设三等,二等线降档(J 降到 130,S 降到 30)。
  • 各省线在基准线基础上按本省成绩分布、评级人数、评级比例做调整,可能高于也可能低于基准线。

下面的计算一律按全国基准线做。 如果安徽的线更高,结论只会更严厉,不会更宽松。

1.2 保 J 一等:255 分意味着什么

看 J (T1–T4),满分 400。

作战方案 得分 够 255 吗
T1 满分 + T2 满分,T3/T4 交白卷 100+100+0+0=200100+100+0+0=200 ❌ 差 55
T1 满分 + T2 满分 + T3/T4 各拿最低档 20 100+100+20+20=240100+100+20+20=240 ❌ 差 15
T1 满分 + T2 满分 + T3 满分 100+100+100+0=300100+100+100+0=300 ✅ 稳
T1 满分 + T2 满分 + T3 中档 40 + T4 暴力 20 100+100+40+20=260100+100+40+20=260 ✅
T1 满分 + T2 丢 30 + T3 满分 + T4 暴力 20 100+70+100+20=290100+70+100+20=290

三条推论,请学生原话记住:

  1. "把 T1 和 T2 做满"不是一等的充分条件,只是必要条件。 200 分离 255 还差整整一道题的一半以上。
  2. 光靠最低档暴力分也不够(240 < 255)。T3 必须拿下,或者 T3/T4 里至少有一道推进到中档。
  3. T4 完全放弃也能拿一等(300 分那一行)。T4 从来不是一等的门槛,T3 才是。

1.3 冲 S 一等这条轨:131 分意味着什么

看 S 子集(T1–T4),满分 400。

作战方案 得分 够 131 吗
T1 满分,T2/T3/T4 全白卷 100+0+0+0=100100+0+0+0=100 ❌ 差 31
T1 满分 + T2 最低档 20 + T4 暴力 20 100+20+0+20=140100+20+0+20=140 ✅
T1 满分 + T2 中档 40 100+40+0+0=140100+40+0+0=140
T1 丢 30 + T2 中档 40 + T3 暴力 20 70+40+20+0=13070+40+20+0=130 ❌ 差 1 分
T1 满分 + T2 满分 100+100+0+0=200100+100+0+0=200 ✅✅

两条推论:

  1. S 一等的门槛结构和 J 一等完全不同。 J 一等要的是"两题满分 + 大量部分分";S 一等要的是"一题满分 + 一点部分分"——131 这条线相对 S 组题目的难度其实是低的。
  2. 所以 S 轨的关键动作只有一个:把 T1 做到零失误。 T1 是 S 层,按七年画像是"想通一句话就写完"的贪心或模拟。T1 满分之后,只要再抠 31 分就够线了,从 T2 的最低档 + T4 的暴力分里就能凑出来。

看第四行:T1 丢了 30 分,后面拿了 60 分,合计 130,差 1 分。 这一行要念给学生听——T3 丢的分,后面三题加起来都很难补回来。

而 T1 是什么难度?CSP-S 七年 T1 画像:

T1:一个干净的贪心或模拟,nn 不大。2021 廊桥分配、2024 决斗、2025 社团招新都是"想通一句话就写完"的题。T1 不会做 = 无缘一等奖。

它不难。它只是需要你不出错。 所以T1 的目标分都是 100,没有折扣。

1.4 ⭐ 双报考生的额外一条

J 组和 S 组通常安排在同一天(一场上午一场下午)或相邻两天。第一场考砸的情绪是第二场最大的敌人。

写进考前清单:离开第一场考场后,不对答案、不上网查题解、不和同学复盘。 第一场的分数已经固定了,你在第二场唯一能改变的是第二场。


2. 开局二十分钟:不要碰键盘

复赛最常见的开局是:开考、打开 T1、开始写。这是错的。

2.1 标准开局流程

时间 动作
0′–3′ 建目录、建四个源文件,先把文件名和 freopen 写对
3′–16′ 通读全部题目,每题记三件事:题意一句话、nn 的量级、有没有特殊性质子任务
16′–20′ 排作战顺序,写在草稿纸上,包括每题的计划用时和"什么时候必须撤"
20′– 才开始写第一行代码

这二十分钟不是浪费。 它买到的是:不会在 T2 上耗掉一小时,然后发现 T3 其实二十分钟就能写完。

2.2 题号顺序 ≠ 难度顺序

出题人大体按难度排,但七年真题里例外不少。

  • 2025 J 组 T4 多边形是七年最简单的 T4(排序 + 前缀和),比同年的 T3 异或和(DP + 哈希表)好写;
  • 2020 J 组 T2 直播获奖是七年最难的 T2,难度高于当年一些 T3。

S 组同理:2022 T1 假期计划是 S⭐,而同年 T2 策略游戏只是 S。

所以通读的核心产出不是"我会不会做",而是"哪道最好拿分"。 先拿最好拿的。

2.3 通读时在题面上标什么

每道题只标四样,用不同符号,二十秒标完:

  • n≤____ —— 圈出所有数据范围
  • ★ —— 子任务表里带特殊性质的行("保证树是一条链"、"保证 k=1k=1"、"保证所有 aia_i 互不相同"),每一行都是独立的分数
  • ? —— 没读懂的地方,先不纠结,读完所有题再回来
  • 预估分 —— 写一个数:这题我觉得能拿多少

把你的预估分加起来,如果不到你的目标线(255 / 131),说明作战计划需要更激进(多投部分分),现在就该知道,而不是三小时后才知道。


3. 从数据范围反推复杂度

这是复赛最高频的"读题技能":nn 的量级直接告诉你该用什么算法。

3.1 对照表

以一秒的时限、10810^8 量级的简单操作为基准(依据见 §3.3 的实测):

nn 的量级 可接受复杂度 典型候选算法
n≤20n\le 20 O(2n)O(2^n)、O(n!)O(n!)(n≤11n\le11) 子集枚举、状压 DP、全排列、折半搜索
n≤100n\le 100 O(n3)O(n^3)、O(n4)O(n^4) Floyd、区间 DP、三重枚举
n≤1000n\le 1000 O(n2log⁡n)O(n^2\log n) 二维 DP + 一个 log
n≤5000n\le 5000 O(n2)O(n^2) 朴素 LCS/编辑距离、O(n2)O(n^2) DP
n≤105n\le 10^5 O(nlog⁡n)O(n\log n)、O(nn)O(n\sqrt n) 排序、堆、线段树、树状数组、Dijkstra、莫队
n≤106n\le 10^6 O(nlog⁡n)O(n\log n) 勉强、O(n)O(n) 稳 线性筛、前缀和、双指针、单调队列
n≤107n\le 10^7 只能 O(n)O(n) 必须是一遍扫描;连 cin 都要关同步或改快读
n≤1012n\le 10^{12} 以上 O(log⁡n)O(\log n)、O(n)O(\sqrt n) 快速幂、数论、二分答案、矩阵快速幂

反向用法更重要:你想到一个 O(n2)O(n^2) 的做法,题目给 n≤105n\le10^5——别急着否定它,它很可能正是某一档部分分的标准答案。

3.2 ⚠️ 秒表会骗你

备考时最常见的验证方式是"我跑一下看看多久"。这个方法在开 -O2 的情况下极不可靠。

本机实测(g++ -O2 -std=c++14):

写法一:for (ll i = 0; i < 1e9; i++) s += i;        实测 0.000 秒
写法二:for (ll i = 0; i < 1e9; i++) s += i ^ (s&7); 实测 0.860 秒

两者都是 10910^9 次循环,差了无穷倍。原因是写法一的结果可以被编译器用求和公式直接算出来,整个循环被删掉了;写法二每一轮都依赖上一轮的 s,删不掉。

同一个 n=108n=10^8 的二重循环,能向量化时 0.051 秒、带数据依赖时 0.086 秒,也差了 1.7 倍。

纪律:判断会不会超时,要数循环体执行了多少次、每次做多少工作,不要跑一次看表。 秒表只用来做一件事:在你已经数清楚工作量之后,验证数量级有没有数错。

3.3 本机标定数据

防优化(带数据依赖)实测,供你校准直觉:

工作量 -O2 不开 -O2
10710^7 次简单循环 0.008 s 0.022 s
10810^8 次简单循环 0.086 s 0.209 s
10910^9 次简单循环 0.860 s 2.127 s
二重循环 n=5000n=5000(2.5×1072.5\times10^7) 0.021 s 0.045 s
二重循环 n=10000n=10000(10810^8) 0.085 s 0.183 s
二重循环 n=20000n=20000(4×1084\times10^8) 0.351 s 0.770 s

容器与排序(-O2,同机):

操作 耗时
sort 10610^6 个 int 0.066 s
sort 10710^7 个 int 0.768 s
map 插入 10610^6 次 0.735 s
unordered_map 插入 10610^6 次 0.340 s
数组随机访问 2×1072\times10^7 次(跳缓存) 0.170 s

三条用法说明:

  1. 评测机通常比开发机慢,按 2~3 倍余量估。 本机 0.35 秒的东西,在评测机上可能 1 秒。
  2. map 比 unordered_map 慢一倍以上,而两者都比数组慢一个数量级。 nn 到 10610^6 还在用 map 就该警惕了(ds-series/01 有完整的复杂度总表)。
  3. 随机访问跳缓存的代价是实打实的:2×1072\times10^7 次随机访问 0.170 秒,比同规模顺序访问慢得多。O(n)O(n) 不等于快。

4. 部分分怎么拿(本讲最重要的一节)

4.1 第一原则:暴力永远先写

正解没想出来的时候,默认动作不是继续想,是先把暴力写了。

理由是算术:一道题的最低档通常值 20~30 分,两道题的暴力就是 40~60 分——正好是 §1.3 / §1.4 里那两个缺口(J 轨差 55、S 轨差 31)。而暴力通常十五分钟能写完。

暴力形态 适用 典型档位
O(2n)O(2^n) 子集枚举 / DFS 回溯 子任务给 n≤20n\le20 20~30 分
O(n2)O(n^2) 或 O(n3)O(n^3) 朴素递推 子任务给 n≤100n\le100 或 n≤5000n\le5000 30~50 分
BFS 暴搜状态空间 图论题的小数据档 20~40 分
直接模拟题意 几乎所有题的最低档 10~30 分

J 组复赛七年里,回溯搜索一次都没当过主考点,但几乎每道 T3/T4 的部分分档都是暴搜——2020 T4 方格取数小数据可以 DFS + 回溯(正解是 DP)、2022 T4 上升点列小 nn 可以爆搜、2024 T4 接龙小数据可以 BFS。

所以搜索在 J 组复赛里的定位是「骗分工具」,不是「满分算法」。 它不需要你学得多深,但必须写得快、写得对。

4.2 第二原则:把子任务表当分数清单读

现代 CSP 题面都带子任务表。每一行特殊性质都是一笔独立的、往往很好拿的分。

常见的"特殊性质"及其含义:

题面写的 它在暗示
保证树是一条链 树形 DP 退化成线性 DP,或直接前缀和
保证 k=1k=1 / m=1m=1 少一维状态,问题塌缩成一个简单版本
保证所有 aia_i 互不相同 不用处理相等的边界,或可以直接排序离散化
保证图是一棵树 / 是 DAG 不用处理环,可以直接 DFS 或拓扑递推
保证 ai≤10a_i \le 10 值域很小 → 桶 / 状压 / 按值分类
保证数据随机 暴力 + 剪枝大概率能过

做法:写完暴力之后,回头扫一遍子任务表,挑改动最小的那一行下手。经常只要在暴力上加一个 if 特判就多 15 分。

4.3 第三原则:骗分的底线

三种输出,价值递减,但都严格大于零:

  1. 输出一个合法解(不保证最优)——很多构造题、方案题对"合法但非最优"有部分分;
  2. 输出 0 / 输出题目允许的默认值——总比不输出强,有些点的答案恰好就是它;
  3. 哪怕只处理 n=1n=1 的情况——真的会有一两个测试点是 n=1n=1。

绝对不要交白卷。 一个 cout << 0; 的程序,在某些年份的某些题上能拿到 5~10 分。

4.4 单题内部的投入梯度

建议的投入顺序:

阶段 时长 产出
想正解 ≤ 25 分钟 想出来就写正解;想不出来进下一阶段
写暴力 15 分钟 20~30 分到手
扫子任务表加特判 10 分钟 再加 10~20 分
撤 — 去下一题

总计 50 分钟,产出 30~50 分。

5. 弃题时机:四条硬规则

策略失误里最贵的一种,是在一道做不出来的题上耗到交卷。它的代价不是这道题的 0 分,是另外三道题本该拿到却没拿的分。

四条规则,建议直接背下来:

规则一(25 分钟法则):一道题想满 25 分钟还没有可以立刻动手实现的思路,停止想正解,转去写它的暴力分。

规则二(暴力也不会就走):如果连暴力都写不出来(通常意味着题意没读懂),立刻离开这道题去下一题。三十分钟后带着清醒的脑子回来,比在这里耗着强。

规则三(1/3 上限):任何单独一道题的累计用时不得超过总时长的 1/3。4 小时的卷子就是 80 分钟;3.5 小时就是 70 分钟。到点无条件停手。

"可以立刻动手实现"是规则一的关键限定。 "我大概知道要用 DP"不算有思路;"状态是 fi,jf_{i,j} 表示前 ii 个里选了 jj 个的最大值,转移是 ..."才算。 说不出状态和转移就是没想出来,别骗自己。

5.1 弃题不等于放弃分数

弃的是"正解",不是"这道题"。 标准的弃题动作是:

  1. 保存当前思路到草稿纸(万一后面有时间回来)
  2. 花十五分钟写完暴力,拿走那 20~30 分
  3. 然后才走

直接关掉文件走人,是把已经到手的分也扔了。


6. 最后三十分钟:一行新代码都不要写

6.1 为什么

最后半小时写的新代码,几乎没有时间测试。一个没测过的改动,破坏已有分数的概率高于增加分数的概率——尤其是当你为了多拿一档分去改一份已经能拿 60 分的代码时。

纪律:最后 30 分钟的唯一任务是保住已有的分。

6.2 交卷前自检清单

按复赛爆零频次排序,每道题都过一遍:

# 检查项 为什么致命
1 文件名、目录名、freopen 的输入输出名字 爆零第一名。 题目要求 apple.in/apple.out,你写成 apple.txt 或者忘了 freopen,这道题满分变 0
2 源文件放对目录了吗 同上。CSP 要求 题目名/题目名.cpp 的目录结构
3 数组开够了吗 n≤105n\le10^5 就开 [100005],别开 [100000];多组数据要开到总和
4 long long 开了吗 两个 10510^5 级别的数相乘就爆 int。累加和、计数、乘积一律先想溢出
5 多测清空了吗 数组、vector、set、计数器、vis 标记、链式前向星的 head
6 调试输出删干净了吗 一个漏掉的 cout << "debug" 让整题 0 分
7 编译警告 g++ -Wall -Wextra 跑一遍,未初始化变量和符号比较警告经常是真 bug
8 极端数据试过吗 n=1n=1、全相等、全递增、最大规模。手输三组,三十秒的事

6.3 用对拍花掉剩下的时间

如果清单都过完了还有时间,对拍是唯一值得做的事:用一个一定正确的暴力和你的正解互相验证。

造数据的三类纪律(写在 tools/gen-template.py 里):

  1. 三档规模:小(能手算验证)、中、极限
  2. 前提被破坏的数据:负数、零、相等、空输入、边界值
  3. 极端形态:全相同、严格单调、链状、菊花状、完全图

只用"随机中等规模"对拍是最常见的自欺——你的 bug 大多藏在边界和极端形态里,随机数据碰不到。


7. 考前清单

开考后:

  • [ ] 0–3′ 建目录、建全部源文件、写对 freopen
  • [ ] 3–16′ 通读题目,标 n≤n\le、标 ★ 特殊性质、标 ?、写预估分
  • [ ] 16–20′ 定作战顺序,写下每题的计划用时和撤退时刻
  • [ ] 预估分加起来够线吗? 不够就把计划改激进(多投部分分)

时间节点(J 3.5 小时卷):

题 预算 J
T1 20′ 必做满分
T2 40′
T3 50′ 中档 40+
T4 60′
检查 20′ ✓

时间节点(S 4 小时卷):

题 预算 S
T1 60′ 必做满分
T2 中档 40+
T3 40′ 只拿暴力分
T4
检查 20′ ✓

每道题:

  • [ ] 想正解 ≤ 25 分钟;说不出状态和转移就是没想出来
  • [ ] 想不出来 → 写暴力(15 分钟,20~30 分)
  • [ ] 写完暴力 → 扫子任务表,挑改动最小的那行加特判
  • [ ] 单题累计用时80分钟 → 无条件停手
  • [ ] T4 用时 > 30 分钟 → 无条件停手
  • [ ] 绝不交白卷,至少输出 0

最后 30 分钟:

  • [ ] 停止写新代码
  • [ ] 逐题过 6.2 的八条清单(文件名!目录!long long!多测清空!)
  • [ ] 还有时间就对拍

两场之间:

  • [ ] 不对答案、不查题解、不和同学复盘

8. 识别信号:看到什么想到什么

考场上看到 立刻想到
子任务表里有"保证 xxx" §4.2,这是一笔独立的分,挑改动最小的做
n≤20n\le20 O(2n)O(2^n) 可行,状压/子集枚举/折半
n≤5000n\le5000 但你只想到 O(n2)O(n^2) 别否定自己,O(n2)O(n^2) 可能就是正解
n≤105n\le10^5 但你只想到 O(n2)O(n^2) 这是某一档部分分的答案,先写了再说
想了 25 分钟还说不出状态转移 转写暴力
这道题已经花了 90 分钟 无条件停手
还剩 30 分钟 停止写新代码,开始查清单
两个 10510^5 的数要相乘 long long
题目有多组数据 所有全局状态都要清空

9. 常见错误与考点分析

错误 1:把目标过高定成"做出所有题"。

错误 2:按 T1→T2→T3→T4 的顺序硬做。 题号顺序不等于难度顺序,也不等于对你的难度顺序。先拿最好拿的。

错误 3:正解没想出来就不动手。 这是丢分最多的单一原因。暴力分是实打实的分,而且是分数缺口的主要来源。

错误 4:为了多拿一档,在最后半小时改一份能得分的代码。 破坏已有分数的概率高于增加。

错误 5:只用随机中等规模数据自测。 bug 藏在边界和极端形态里。

错误 6:用秒表判断会不会超时。 -O2 会把可优化的循环整个删掉,实测 0.000 秒(§3.2)。要数工作量。

错误 7(最贵的一个):文件名写错。 一道题的满分变 0 分,写错四个就是整张卷子归零。这是复赛唯一一种"技术水平完全无关"的爆零方式,而它每年都在发生。


10. 课后练习

本讲没有题单——本讲的练习就是模拟赛本身。

每场赛后必须填 mock-0X-review.md 里的得分复盘表。光做题不复盘,策略短板不会好——因为策略失误在做题当下是感觉不到的,只有在复盘表上把"你的用时"和"建议用时"并排放,才看得见。


11. 小结

  1. J:T1+T2 满分只有 200 分,不够;必须从 T3/T4 抠出 55 分以上,且不能只靠最低档暴力(240 仍然不够)。
  2. S:门槛结构完全不同——T1 满分 100 分之后,只要再抠 31 分就够线。
  3. 开局二十分钟不碰键盘:通读、标数据范围和特殊性质、排作战顺序。
  4. 数据范围反推复杂度;判超时要数工作量,秒表在 -O2 下会骗人。
  5. 暴力永远先写,子任务表当分数清单读,绝不交白卷。
  6. 三条弃题硬规则:25 分钟没思路转暴力、暴力也不会就走、单题不超过总时长 1/3。
  7. 最后 20–30 分钟不写新代码,只查清单和对拍。文件名是爆零第一名。

0 条评论

目前还没有评论...