2026 CSP-J 复赛真题超详解析和分分数线预测
- 2026-11-03 02:31:42
CSP-J/S 2026 第二轮 · 入门组
2026 CSP-J 复赛真题超详解析
四题满分思路逐讲 + 2026 分数线深度预测
考试时间:2026年10月31日 08:30–12:00 | 满分 400 分(4题×100分)
‘
01 考情速览:四题全景图
本次比赛共 4 题,每题 100 分、20~25 个测试点,时限 1 秒,内存限制 1024 MiB,编译命令 -O2 -std=c++14。总体结构与近年一致,未出现题型创新,难度梯度为:
题目 | 考点 | 难度 | 满分代码量 | 一句话点评 |
T1 旅游 travel | 字符串·模拟 | 入门 ★ | 约 25 行 | 高铁座位判断,签到送分题 |
T2 回文串 string | RLE·双指针·贪心 | 中档 ★★★ | 约 25 行 | 压缩串上配对,注意 long long |
T3 按位与 and | 位运算·贪心 | 中档 ★★★ | 约 20 行 | 从高位逐位确定,套路题 |
T4 纸牌游戏 card | 链·树·子树统计 | 较难 ★★★★ | 约 40 行 | 全场拉分题,结论漂亮 |
和 2024、2025 两年相比:T1 同为签到题;T2、T3 比去年略难但套路常见;T4 比去年 T4(枚举+结论)思维门槛更高,但暴力分很足。
02 T1 旅游(travel):车厢座位判断
▍题意回顾
列车共 17 节车厢,01、16 号为一等座,其余为二等座。每节二等座车厢 18 排、每排 5 座,座位号形如 03C(两位排号+一位字母)。每排从左到右依次是 A、B、C、D、F,其中 C 与 D 之间是过道:过道左侧为 A、B、C,右侧为 D、F。
给定两张车票 c1 s1 c2 s2,依次输出 4 个 0/1 判断:① 是否同一车厢;② 是否同一排;③ 是否同排且过道同侧;④ 是否相邻。相邻定义为:同一车厢、同一排、过道同侧,且在该侧座位序列中紧挨着(如 A-B、B-C 相邻,A-C 不相邻)。
▍思路推导
本题是纯粹的字符串处理 + 模拟,关键在把四个条件拆成逐级递进:
1. 同一车厢:c1 == c2。数据保证两票至少有一处不同,且都是二等座车厢,不用判 01/16。
2. 同一排:必须先同车厢,再比较座位号前两位(排号)相同。
3. 同侧:必须先同排,再判断两个末位字母是否同属 {A,B,C}(左)或 {D,F}(右)。
4. 相邻:必须先同侧,再在各自侧的序列里查下标:左侧序列 ABC 中下标差 1,右侧序列 DF 中下标差 1。
易错点:① 第 2 问忘了先判同车厢(不同车厢的同排号应输出 0,见样例 5);② 01C 与 01D 同排但在过道两侧,第 3 问是 0(见样例 3);③ D 和 F 在同一侧且相邻,别把过道想象成隔开 D/F;④ 读入用四个 string 直接比较即可,无需转数字。
▍参考代码(已过全部样例)
#include
using namespace std;
int main(){
stringc1,s1,c2,s2;
cin>>c1>>s1>>c2>>s2;
stringans;
//Q1 same carriage
ans+= (c1==c2)?'1':'0';
//Q2 same row
boolsameCar=(c1==c2);
boolsameRow = sameCar && (s1.substr(0,2)==s2.substr(0,2));
ans+= sameRow?'1':'0';
//Q3 same side: A,B,C left; D,F right
autoside=[](char ch){return (ch=='A'||ch=='B'||ch=='C')?0:1;};
boolsameSide = sameRow && (side(s1[2])==side(s2[2]));
ans+= sameSide?'1':'0';
//Q4 adjacent: same side and letters adjacent in A B C / D F
booladj=false;
if(sameSide){
stringL="ABC", R="DF";
string&seq = (side(s1[2])==0)?L:R;
intp1=seq.find(s1[2]), p2=seq.find(s2[2]);
adj= (abs(p1-p2)==1);
}
ans+= adj?'1':'0';
cout< <ans<<endl;< span> </ans<<endl;<>
return0;
}
复杂度:O(1)。测试点 20 个、等分,按特殊性质分层递进,全对可稳拿 100 分。
03 T2 回文串(string):压缩串的最少修改
▍题意回顾
字符串 S 只由小写字母构成,但以游程编码(RLE)形式给出:n 段,第 i 段是 aᵢ 个字符 cᵢ(1 ≤ aᵢ ≤ 10⁹,n ≤ 2×10⁵)。总长 L 可达 2×10¹⁴,绝不能真的把字符串展开。求把 S 改成回文串最少要改多少个位置(每次可把任一位置改成任意小写字母)。
▍思路推导
回文判定是位置对位置的:第 p 位要与第 L+1−p 位相同。我们从外向内逐对处理,但由于段内字符全相同,可以把“同一对”批量结算——用双指针在段序列上滑动:
· 左指针 (i, oi):最左未处理位置落在第 i 段、段内偏移 oi;右指针 (j, oj):最右未处理位置落在第 j 段、从右数偏移 oj。
· 每轮比较两个指针所指字符:若不同,本轮内每一对位置都要改 1 次,代价累加“本轮处理的对数”;若相同则无代价。
· 本轮能处理的对数 = min(左段剩余, 右段剩余),双指针同步前进。某段耗尽就移到下一段。
· 若两指针落进同一段,段内字符必然相同,剩余部分左右互配、中间至多留一个单字符,均无代价,直接结束。
为什么“改一侧凑另一侧”最优?每对位置若不同,至少要改 1 个位置,而改 1 个总能达成——各对互不影响,所以下界可达,贪心恰好等于下界。
样例 3 演示:S = a×10⁹ + a×10⁹ + a×10⁹ + b×10⁹ + b×10⁹ + b×10⁹,总长 6×10⁹。前一半全是 a、后一半全是 b,每一对 (p, L+1−p) 都是 a 对 b,共 3×10⁹ 对,答案 3000000000 —— 超过 int 范围,必须用 long long,这正是本题最大的坑!
▍复杂度与易错点
· 时间 O(n):每段只被左右指针“吃掉”一次;空间 O(n)。
· 易错点 1:答案最大约 10¹⁴ 量级,不用 long long 直接挂样例 3。
· 易错点 2:同段相遇(i == j)时的收尾处理,剩余长度为偶数完全互配、奇数留中间一个字符,都不产生代价。
· 部分分提示:n ≤ 2、max aᵢ ≤ 50 等测试点允许真展开字符串暴力配对,可拿 40 分左右保底。
▍参考代码(已过全部样例)
#include
using namespace std;
typedef long long ll;
int main(){
intn;
if(scanf("%d",&n)!=1)return 0;
vector
charbuf[8];
for(inti=0;i
inti=0,j=n-1; ll oi=0,oj=0;
llL=0; for(int k=0;k
llpl=0, pr=L-1, cost=0;
while(pl <pr){< span> </pr){<>
llrl=a[i]-oi, rr=a[j]-oj;
llstep=min(rl,rr);
if(c[i]!=c[j])cost+=step;
oi+=step;oj+=step; pl+=step; pr-=step;
if(oi>=a[i]){i++; oi=0; }
if(oj>=a[j]){j--; oj=0; }
if(i>j)break;
}
printf("%lld\n",cost);
return0;
}
04 T3 按位与(and):选 m 个数最大化 AND
▍题意回顾
给定 n ≤ 2×10⁵ 个非负整数(aᵢ < 2³⁰),从中选出恰好 m 个,使它们的二进制按位与最大,输出这个最大值。
▍思路推导
按位与有一个决定性性质:高位是 0,低位再大也没用(如 10xxx > 01xxx)。这提示我们从最高位(第 29 位)到最低位逐位“试探确定”:
· 设已确定的答案高位掩码为 P(目前要求选中的数在这些位上必须全是 1)。
· 尝试把第 b 位也设为 1:令 Q = P | 2ᵇ,统计满足 (aᵢ & Q) == Q 的数的个数 cnt。这些数就是“能同时满足所有已确定 1 位+第 b 位”的候选。
· 若 cnt ≥ m:说明从候选里总能凑够 m 个,第 b 位可以是 1,令 P = Q;否则该位只能是 0,P 不变。
· 30 位扫完,P 就是答案。
正确性要点:可行性关于 P 单调——满足 (a&P)==P 的数集随 P 增大而缩小,因此逐位贪心不会把后面“做死”:某位取 0 后,后续位仍能在当前候选集中继续尝试取 1。
样例 2 逐步演示:{31=11111₂, 3=00011₂, 1=00001₂, 15=01111₂, 7=00111₂} 选 3 个。试第 4 位(16):只有 31 满足 → 1<3,取 0;试第 3 位(8):31、15 满足 → 2<3,取 0;试第 2 位(4):31、15、7 满足 → 3≥3,取 1;试第 1 位(2):要求含 4+2 位,31、15、7 满足 → 取 1;试第 0 位(1):要求含 4+2+1 位,31、15、7 满足 → 取 1。答案 = 4+2+1 = 7,与标准输出一致。
▍复杂度与易错点
· 时间 O(30n) ≈ 6×10⁶,1 秒内轻松通过;空间 O(n)。
· 易错点:想当然“先排序取前 m 大”是错的——按位与不是数值大小叠加;也有选手想枚举每个答案位数做子集 DP,均不必要,逐位贪心是最短路径。
· 部分分提示:m=1 时答案是最大值;m=n 时是全体按位与;n ≤ 20 可 2ⁿ 枚举子集;特殊性质 A(aᵢ = 2ᵏ−1,即全 1 前缀)满足“大数 AND 小数=小数”,按数值排序取前 m 大的 AND 即可——各档部分分设计得很友好。
▍参考代码(已过全部样例)
#include
using namespace std;
int main(){
intn,m;
if(scanf("%d%d",&n,&m)!=2) return 0;
vector
for(inti=0;i
unsignedP=0;
for(intb=29;b>=0;b--){
unsignedQ=P|(1u< <b);< span> </b);<>
longlong cnt=0;
for(inti=0;i
if(cnt>=m)P=Q;
}
printf("%u\n",P);
return0;
}
05 T4 纸牌游戏(card):n 局桌面牌的统计
▍题意回顾
牌堆 n ≤ 5×10⁵ 张,从上到下点数 a₁…aₙ(1 ≤ aᵢ ≤ m ≤ 3×10⁵,每种点数至少出现一次)。共打 n 局:第 i 局跳过前 i−1 张,从第 i 张打到第 n 张。桌面从左到右成行,打出点数 k 时:桌面没有 k 就放到最右端;有 k 就收走桌面上的 k 及其右侧所有牌,再把 k 放最右端。对每个点数 i,统计有多少局结束时桌面上留有点数 i 的牌。
▍第一步:桌面就是“按点数去重的栈”
把桌面看作栈(左=栈底):打出 k 时若 k 在栈中,弹出 k 及其以上所有,再压入 k;否则直接压入。样例 1 的四局依次得到栈 [1,3]、[2,1,3]、[1,3]、[3],与题面完全一致。
▍第二步:关键结论——局与局之间的跳变
核心观察:第 i 局先打出 aᵢ,它位于栈底。在 aᵢ 的下一次出现位置 nxt(i) 之前,任何截断的触发牌都不可能是 aᵢ(中间没有同点数牌),而截断只会从触发牌位置往右收——所以 aᵢ 一定安然活到 nxt(i) 时刻。此时打出 aᵢ 的同点数牌,截断从栈底开始收走整栈,桌面回到只有一张牌的状态!于是:
结论:若 nxt(i) 存在,第 i 局的结束局面与第 nxt(i) 局完全相同;若不存在(aᵢ 是该点数最后一次出现),则结束局面 = [aᵢ] 叠上第 i+1 局的结束局面。
▍第三步:把栈“翻译”成链,再变成树
设 LO(v) 为点数 v 的最后一次出现位置。沿上面结论一路化简,第 i 局的结束栈恰好是:
q₀ = LO(a[i]),q₁ = LO(a[q₀+1]),q₂ = LO(a[q₁+1]),…… 一路走到 q = n 为止,栈中点数按 q 的位置从左到右依次为 a[q₀], a[q₁], …
也就是说,每个位置只关心“从它出发沿 q → LO(a[q+1]) 的链”。由于链总终于位置 n,以“点数 v 的 LO(v)”为节点、q 的后继为 LO(a[q+1]) 建树:
· 每个点数 v 是一个节点;若 LO(v) < n,其父亲为点数 a[LO(v)+1];LO(v) = n 的是根。
· 第 i 局经过的节点 = 从节点 a[i] 到根的路径。于是:
答案 ans[v] = 在节点 LO(v) 的子树中(含自身)挂载的游戏局数。而第 i 局恰好挂在节点 a[i] 上,所以把每个 i 挂到节点 a[i],求每棵子树的挂载总数即可!
样例 2 验证:a = 3 1 2 1 3 2 3 1 2 1,LO(1)=10、LO(2)=9、LO(3)=7。节点 7(点数3)的后继是 a[8]=1 → 父为节点 10;节点 9(点数2)的后继是 a[10]=1 → 父为节点 10;节点 10 是根。第 i 局挂到节点 a[i]:节点 7 挂 3 局、节点 9 挂 3 局、节点 10 挂 4 局。ans[3]=子树(7)=3,ans[2]=子树(9)=3,ans[1]=子树(10)=3+3+4=10,输出 10 3 3,与标准答案一致!
▍复杂度与实现细节
· 建树 O(m),统计子树 O(m),总时间 O(n + m),空间 O(n + m)。
· 树深最坏可达 m ≈ 3×10⁵(例如点数递增出现),建议用迭代方式求子树和,避免递归爆栈;当然本题栈空间与内存限制相同(1024 MiB),递归也能过,但迭代更稳。
· 部分分提示:直接按题意模拟每局 O(n²) 可过 n ≤ 500 与 n ≤ 5000 的多数测试点;特殊性质 A(序列不降)时桌面始终形如单调结构,另有专门测试点。暴力 + 两个性质分,没想出正解也能拿到 40~60 分。
▍参考代码(已过全部样例,另经 33000 组随机数据对拍验证)
#include
using namespace std;
int main(){
intn,m;
if(scanf("%d%d",&n,&m)!=2) return 0;
vector
for(inti=1;i<=n;i++){ scanf("%d",&a[i]); LO[a[i]]=i; }
vector <long </longlong> cnt(m+1,0);
for(inti=1;i<=n;i++) cnt[a[i]]++;
vector <vector
vector
for(intv=1;v<=m;v++){
if(LO[v] <n){< span> </n){<>
intp=a[LO[v]+1];// 父节点 = LO(a[LO(v)+1]) 的点数
ch[p].push_back(v);
}elseroots.push_back(v);// LO(v)==n 为根
}
vector
vector
while(!st.empty()){
intu=st.back(); st.pop_back();
order.push_back(u);
for(intc:ch[u]) st.push_back(c);
}
vector <long </longlong> sub(m+1,0);
for(intidx=(int)order.size()-1;idx>=0;idx--){
intu=order[idx];
sub[u]=cnt[u];
for(intc:ch[u]) sub[u]+=sub[c];
}
for(intv=1;v<=m;v++) printf("%lld%c",sub[v],v==m?'\n':' ');
return0;
}
06 难度评析:这届题“送分”吗?
把本届与近两年真题横向对比:
位置 | 2024(T1扑克/T2地图/T3小木棍/T4接龙) | 2025 | 2026 本届 |
T1 | 纯模拟签到 | 签到 | 字符串模拟签到(持平) |
T2 | 模拟+枚举,偏易 | 中档 | RLE 双指针,需 long long(略升) |
T3 | 贪心构造,区分度中等 | 中档 | 位贪心,套路常见(持平略易) |
T4 | 中档结论题 | 中档 | 建树+子树统计,思维门槛最高(明显更难) |
总体判断:
· 中前段(T1~T3)难度与去年大体持平,T2 的 long long 坑会让一部分粗心选手丢 20~40 分;
· T4 明显比前两年更“压轴”:想出“局间跳变 + 建树”需要竞赛直觉,但它的暴力分充足(O(n²) 模拟 + 两个特殊性质),实际分差主要体现在 250 分以上高分段的争夺。
· 选手典型得分结构预计为:T1 满分 + T2 70~100 + T3 60~100 + T4 20~50。
07 历年分数线回顾:CCF 官方基准线
第二轮评级采用“全国基准线 + 各省名额”制度:CCF 先公布全国认证基准线(拟评级比例 20%),再按“第二轮人数与平均分(A)+第一轮人数(B)+初赛晋级比例(C)”给各省分配名额,各省分数线自然分化。以下为官方公布的历年入门组(J 组)第二轮一等/一级全国基准线:
年份 | J组一等/一级基准线 | S组基准线 | J组题面总体难度 | J组评级总人数(比例) |
2021 | 160 分 | 100 分 | 中等 | — |
2022 | 160 分 | 130 分 | 中等偏难 | — |
2023 | 180 分 | 135 分 | 中等偏难 | 6201 人(21.48%) |
2024 | 250 分 | 165 分 | 明显偏易 | 8167 人(20.20%) |
2025 | 255 分 | 131 分 | 中等 | 8135 人(20.75%) |
两个关键规律:① 基准线弹性极大(160 → 250),主要由试题难度决定,而非人数;② 评级比例始终锁定 20% 上下,名额随参与规模水涨船高——2023→2024 年 J 组一等总人数从 6201 增至 8167。
注意:2025 年起 CCF 将“一/二/三等”更名为“一/二/三级”,评级规则不变;S 组 2025 年基准线 131 分较 2024 年 165 分大跌,正是提高组试题变难的直接体现——基准线高低与当年题目难度强相关,这就是预测 2026 年分数线的核心逻辑。
▍2025 年各省 J 组一级线(最近一年的“省线地图”)
以下为 CCF 官方公布的 CSP-J/S2025 第二轮入门组各省一级分数线(总人数为该省参评人数):
梯队 | 省份(分数线) |
第一梯队 ≥265 | 重庆 295|浙江 285|广东 270|四川 270|上海 265|北京 265 |
第二梯队 240~256 | 香港 257|安徽 257|福建 256|江苏 252|湖南 245|澳门 244|山东 240 |
第三梯队 205~239 | 湖北 235|江西 235|河南 235|河北 230|陕西 230|吉林 227|天津 227|辽宁 225|贵州 222|山西 222|云南 222 |
第四梯队 <220 | 黑龙江 220|海南 220|新疆 220|内蒙古 215|广西 215|甘肃 211|宁夏 205|青海 205 |
(2024 年对照:重庆/浙江 265 一骑绝尘,上海/广东/江苏/北京/四川/安徽/福建 260,山东/湖南 235,青海 165 为全国最低。省线结构与 2025 年高度一致,说明“省线梯队”相当稳定。)
08 2026 分数线预测:基准线看 250 上下
▍四个判断依据
依据一 · 试题难度:本届 T1 签到、T2/T3 中档套路题、T4 压轴偏难但暴力分足。整体难度应略高于 2024(基准线 250),与 2025(255)相当或略难。
依据二 · 参与规模:2026 年初赛 J 组全国一级线 69.5 分(去年 63.5,连续上涨),各地晋级人数创新高(如浙江 J 组入围 2019 人,而 2022 年仅 1143 人)。高分段厚度继续增加,对基准线是向上推力。
依据三 · 评级机制:拟评级比例仍是 20%,规则公式不变。基准线由“全国 20% 分位选手”的成绩决定——题目难,20% 分位的绝对分数就低;题易则高。
依据四 · 分数结构:T4 区分度大但集中于头部;20% 分位附近的选手主要拼 T1+T2+T3 的得分率,典型得分 220~260,这一区间正是基准线的落点。
▍预测结论
2026 年 CSP-J 第二轮一级(一等)全国基准线预测:245~260 分,中位预测 250 分左右。 若你自估分数 T1+T2+T3 基本拿满(≥260):一线希望很大,各省基本稳; 自估 240~260:基准线之上,强省压线、弱省稳; 自估 200~240:视所在省名额而定,二线省份(第三梯队)仍有较大一级机会; 自估 130 分以上:一级线以下的省份可评二级(基准 205/130 双通道),80/130 分以上关注三级。
▍各省一级线预测参考(基于 2025 年省线 ± 浮动)
省份名额由本省参评人数、平均分与晋级比例决定,省线会随全国基准线同步平移。若全国基准线落在 250 附近,各省一级线预测如下:
梯队 | 预测区间 | 代表省份 |
第一梯队 | 255~295 | 重庆、浙江、广东、四川、上海、北京 |
第二梯队 | 235~255 | 安徽、福建、江苏、湖南、山东、香港、澳门 |
第三梯队 | 210~235 | 湖北、江西、河南、河北、陕西、吉林、天津、辽宁、贵州、山西、云南 |
第四梯队 | 180~220 | 黑龙江、海南、新疆、内蒙古、广西、甘肃、宁夏、青海 |
说明:表中区间为基于 2025 年省线的平移预测,仅供估分参考。每年名额调整、省际流动明显,个别省浮动可达 ±20 分。
▍什么时候出分?
参照往年节奏:第二轮结束后约 两周(11 月中旬)CCF 公布评级规则与全国基准线,随后各省陆续公布名单与省线。2025 年是 11 月 14 日公布评级规则,预计 2026 年也在 11 月中旬前后,请留意 CCF 官网与各省通知。
09 写给接下来备赛的选手
1. 模拟题是基本盘:T1、T2 这类“读题 5 分钟、写码 20 分钟”的题必须零失误,样例要手算到位(本届 T2 的 long long 就是隐性样例陷阱)。
2. 套路题建立“条件反射”:按位贪心、RLE 双指针、栈模拟都是高频套路。每学一个套路,问自己三个问题:正确性怎么证?边界在哪?暴力怎么写来对拍?
3. 部分分意识:本届 T4 若只写 O(n²) 模拟 + 特殊性质,也能拿到近半分数。考场上“先写暴力再优化”永远比空着强。
4. 对拍习惯:从随机小数据开始对拍(暴力 vs 正解),是 T4 这类结论题最可靠的保险。
5. 复盘路径:等 CCF 公布官方题解和数据后,重点复盘 T4 的建树证明细节——这个模型(局间跳变 + 子树统计)非常值得收进模板库。
· · ·
免责声明:本文真题信息整理自比赛试卷,解析与参考代码为独立复原并经样例/对拍验证,不代表官方题解;分数线预测基于 CCF 官方公开的历年评级规则与省线数据(2021–2025)及本届试题难度分析,仅供估分参考,最终分数线以中国计算机学会(CCF)官方公布为准。
数据来源:CCF 官网(noi.cn / noi.ccf.org.cn)CSP-J/S 2021–2026 各轮评级公告