acmer-coach 2.5.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,6 +121,22 @@ learned/verified 记录,或路线中在此前安排的必验训练,不能从
121
121
 
122
122
  详见 [长期课程机制](docs/长期课程机制.md)。
123
123
 
124
+ ### 2.6.1:中国区多赛站资料
125
+
126
+ `regional-diagnostic` 现在有五站六场、七十道已核对题意与官方题解的样本:南京2022十三题与2023六题、西安2025十三题、杭州2024十三题、上海2025十三题、香港2025十二题。每题保留教学模型、现有能力ID及真实PDF页码。
127
+
128
+ 西安配置继续使用旧 `xian-pending` ID,内容已补为2025全卷十三题,已有目标不用迁移。更多比赛保留在[56场中国区资料索引](docs/china-contest-sources.md),按需核验,不把候选链接数量当审核覆盖。杭州的浙江省赛错配已更正为UCup Stage25、场次1893;原始工作表未修改。
129
+
130
+ 资料扩充不增加工具、课程引擎或评分权重。小鲸根据个人和团队训练证据选择重点;样本不是完整考纲、出题概率、学生掌握记录或金牌保证。尚未运行全部题目解法、交互器或完整核验现场奖牌榜。
131
+
132
+ ### 2.6:独立验收、灵活训练与逐题依据
133
+
134
+ 章节分数及限时通过仍记为 `passed`,但只有本次做出的题都明确报告 `independent: true`,才新增 `verified` 和验证段位。独立性未知或有帮助时,保留实际成绩,不能自动认证;旧证书保留,不补造独立事实。独立性来自明确记录,不是工具能从 AC 猜出的结论。延迟保持与迁移仍由既有课程 `exitChecks` 单独验收。
135
+
136
+ 训练沿用 `coach_assign` / `coach_log` / `coach_plan`:短诊断和整场 VP 可以直接绑定比赛能力,时长由教练明确给出;旧知识点练习和默认时长继续支持。计划只记录安排,不证明训练完成。
137
+
138
+ `coach_target profiles` 和 `coach_focus` 返回逐题 `samples` 与 `coverage`。2.6最初包含南京2022十三题与2023六题,2.6.1扩至五站七十题并补齐西安样本;NWERC十三题仅作扩展参考,WF的三题仍是题面诊断。覆盖数字不产生专题频率、奖牌线或预测;小鲸结合个人证据决定重点。
139
+
124
140
  ### 2.5:接着教,判断仍归小鲸
125
141
 
126
142
  `coach_note` 只做一件事:把一个知识点的教学判断和接续点留在现有
@@ -152,7 +168,7 @@ learned/verified 记录,或路线中在此前安排的必验训练,不能从
152
168
  `read` 返回每项 `exitCheckResults` 和缺口;旧 v1/v2 课程只读保留,先 `revise` 补齐条件
153
169
  后升级 v3。通过检测证明的是该次条件下的表现,不能解释成永久掌握。
154
170
 
155
- `coach_target profiles` 提供 `regional-diagnostic`、`wf-extension`、`xian-pending` 三个
171
+ `coach_target profiles` 提供 `regional-diagnostic`、`nwerc-reference`、`wf-extension`、`xian-pending` 四个
156
172
  有来源、采样范围和限制的配置,选定后可通过 `profileId` 保存。它们都仍是 provisional,
157
173
  不是西安考纲、专题频率或奖牌保证。`coach_scope` 优先使用14张精确节点卡,返回识别条件、
158
174
  证明问题、失效反例、迁移练习与原始资料,避免把一个 DP 通用卡当成所有 DP 节点的讲法。
@@ -1,61 +1,187 @@
1
- # 这是可追溯的选题诊断,不是出题频率榜;provisional 禁止解释成官方考纲。
1
+ # 有限真题支持教学诊断;候选索引、样本覆盖和出题频率分别说明。
2
2
  version: 1
3
3
  profiles:
4
4
  - id: regional-diagnostic
5
- title: 区域赛通用能力诊断(有限样本)
6
- scope: 用公开区域赛的题面与官方解题建立诊断任务,再结合本人 VP 证据取舍。
7
- status: provisional
5
+ title: "中国亚洲区域赛能力诊断(五站六场样本)"
6
+ scope: "以南京、西安、杭州、上海、香港原题和命题组题解诊断比赛能力,结合本人和团队的 VP 事实取舍。"
7
+ status: "provisional"
8
8
  sources:
9
- - title: NWERC 2024 官方题面(采样 A、D、E、F、K、L)
10
- url: https://2024.nwerc.eu/main/problem-set.pdf
11
- - title: NWERC 2024 官方解题(A/D/E/F/K/L 对应页)
12
- url: https://2024.nwerc.eu/main/solutions.pdf
13
- - title: ICPC NCNA 公布的区域赛规则(通用背景,不提供专题频率)
14
- url: https://nc.na.icpc.global/rules/
15
- competencyIds: [contest-reading, contest-decision, implementation-stability, dp-modeling, graph-modeling, data-structures, math-combinatorics, code-review, team-communication]
9
+ - {"title":"SUA 南京 2022 命题组中文题解(全卷十三题)","url":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf"}
10
+ - {"title":"SUA 南京 2023 命题组题解(QOJ 镜像,采样六题)","url":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf"}
11
+ - {"title":"Xi'an 2025 命题组题解(全卷13题)","url":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1"}
12
+ - {"title":"Hangzhou 2024 命题组题解(全卷13题)","url":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1"}
13
+ - {"title":"Shanghai 2025 命题组题解(全卷13题)","url":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf"}
14
+ - {"title":"Hong Kong 2025 命题组题解(全卷12题)","url":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf"}
15
+ - {"title":"中国区比赛资料索引(56场候选,按需核验)","url":"https://github.com/Miantiao1231/acmer-coach/blob/main/docs/china-contest-sources.md"}
16
+ competencyIds: ["contest-reading","contest-decision","implementation-stability","dp-modeling","graph-modeling","data-structures","math-combinatorics","code-review","team-communication"]
17
+ samples:
18
+ - {"year":2022,"contest":"Nanjing","problem":"I","model":"从旋转回文条件推出字符频次计数","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=3"}
19
+ - {"year":2022,"contest":"Nanjing","problem":"G","model":"维护总和及数量的可反悔贪心","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=5"}
20
+ - {"year":2022,"contest":"Nanjing","problem":"D","model":"二分阈值与有效操作区间前缀统计","competencyIds":["contest-reading","data-structures"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=7"}
21
+ - {"year":2022,"contest":"Nanjing","problem":"B","model":"单调队列优化 DP 与前后缀复用","competencyIds":["dp-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=10"}
22
+ - {"year":2022,"contest":"Nanjing","problem":"A","model":"整体移动转边界与二维前缀和","competencyIds":["contest-reading","data-structures"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=15"}
23
+ - {"year":2022,"contest":"Nanjing","problem":"M","model":"局部极小与水平边界的分类计数","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=19"}
24
+ - {"year":2022,"contest":"Nanjing","problem":"J","model":"等式变二分图边与连通块配对","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=22"}
25
+ - {"year":2022,"contest":"Nanjing","problem":"E","model":"树形 DP 与虚树深度统计","competencyIds":["dp-modeling","graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=25"}
26
+ - {"year":2022,"contest":"Nanjing","problem":"C","model":"逆序操作与通配位置的贪心构造","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=28"}
27
+ - {"year":2022,"contest":"Nanjing","problem":"H","model":"树上边贡献与凹性背包合并优化","competencyIds":["dp-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=33"}
28
+ - {"year":2022,"contest":"Nanjing","problem":"K","model":"堆排列概率与完全二叉树对称计数","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=36"}
29
+ - {"year":2022,"contest":"Nanjing","problem":"L","model":"链上弦覆盖与二边割的增量维护","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=45"}
30
+ - {"year":2022,"contest":"Nanjing","problem":"F","model":"锐角三角剖分的基例与递增构造","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://sua.ac/wiki/2022-icpc-nanjing/tutorial-sketch-zh.pdf#page=48"}
31
+ - {"year":2023,"contest":"Nanjing","problem":"I","model":"按重置时间排序并检查约束区间一致性","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=3"}
32
+ - {"year":2023,"contest":"Nanjing","problem":"F","model":"最后写入者依赖 DAG 与拓扑序交换","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=5"}
33
+ - {"year":2023,"contest":"Nanjing","problem":"C","model":"异或计数同余与区间分解,题名不是算法标签","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=7"}
34
+ - {"year":2023,"contest":"Nanjing","problem":"G","model":"交换论证结合前缀选择与后缀背包","competencyIds":["dp-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=9"}
35
+ - {"year":2023,"contest":"Nanjing","problem":"A","model":"双位置可达状态与相对移动约束","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=11"}
36
+ - {"year":2023,"contest":"Nanjing","problem":"L","model":"降序楼层贪心与放松下界的匹配证明","competencyIds":["math-combinatorics","contest-reading"],"solutionReviewed":true,"sourceUrl":"https://universal-cup-website.qoj.ac/files/ucup/tutorials/tutorials-2-11.pdf#page=13"}
37
+ - {"year":2025,"contest":"Xi'an","problem":"A","model":"最大攻击者归约与区间覆盖链的线段树动态维护","competencyIds":["contest-reading","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=1"}
38
+ - {"year":2025,"contest":"Xi'an","problem":"B","model":"端点颜色修正的重排判定、双指针最短区间与贪心构造","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=2"}
39
+ - {"year":2025,"contest":"Xi'an","problem":"C","model":"毛毛虫森林判定与双指针维护诱导子图度数","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=4"}
40
+ - {"year":2025,"contest":"Xi'an","problem":"D","model":"前后缀可达点压缩边数,分列选择构造不同共同可达集合","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=5"}
41
+ - {"year":2025,"contest":"Xi'an","problem":"E","model":"重链剖分把根路径翻转转成前缀,分块统计区间操作的奇偶贡献","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=6"}
42
+ - {"year":2025,"contest":"Xi'an","problem":"F","model":"单后继依赖形成基环树,从环上首个相遇事件传播停止时间","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=6"}
43
+ - {"year":2025,"contest":"Xi'an","problem":"G","model":"相邻交换论证得到升降序投票贪心","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=7"}
44
+ - {"year":2025,"contest":"Xi'an","problem":"H","model":"黑色连通块计数,EGF、Lagrange 反演与 Stirling 多项式提取系数","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=7"}
45
+ - {"year":2025,"contest":"Xi'an","problem":"I","model":"三点路径异或求中心,恢复祖先关系与相邻深度树边","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=8"}
46
+ - {"year":2025,"contest":"Xi'an","problem":"J","model":"购点树形 DP 维护最小和次小子代价,祖先链前缀和回答合并查询","competencyIds":["dp-modeling","graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=8"}
47
+ - {"year":2025,"contest":"Xi'an","problem":"K","model":"按位子集包含的排列匹配,删一位建图压缩网络流","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=9"}
48
+ - {"year":2025,"contest":"Xi'an","problem":"L","model":"多边形边长判定、排序连续段与单调指针求各边数最大周长","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=9"}
49
+ - {"year":2025,"contest":"Xi'an","problem":"M","model":"消空性质分类与补集两状态 DP,区分 1、至少 n 的值和奇偶特例","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=10"}
50
+ - {"year":2024,"contest":"Hangzhou","problem":"A","model":"等位字符约束连成等价类,连通块判定能否区分第三串","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=4"}
51
+ - {"year":2024,"contest":"Hangzhou","problem":"B","model":"线段树压缩每位唯一零与区间按位与,定位最优删除位置","competencyIds":["data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=17"}
52
+ - {"year":2024,"contest":"Hangzhou","problem":"C","model":"凸包内公切线界定遮挡半平面,扫描有理数开区间补集","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=42"}
53
+ - {"year":2024,"contest":"Hangzhou","problem":"D","model":"前缀匹配 DP 逐位构造最小字典序,另有 Lyndon 分解解法","competencyIds":["dp-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=27"}
54
+ - {"year":2024,"contest":"Hangzhou","problem":"E","model":"必需上行和空档建立下界,单调指针与优先队列构造运输顺序","competencyIds":["math-combinatorics","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=7"}
55
+ - {"year":2024,"contest":"Hangzhou","problem":"F","model":"排名前缀集合确定 SCC 分段,前缀和统计区间互相可达对","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=14"}
56
+ - {"year":2024,"contest":"Hangzhou","problem":"G","model":"拆环并延长的基环树 DFS,维护各颜色第 k 次出现距离","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=25"}
57
+ - {"year":2024,"contest":"Hangzhou","problem":"H","model":"重链长度的不可行情形分类,借最长链挂接构造原树","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=8"}
58
+ - {"year":2024,"contest":"Hangzhou","problem":"I","model":"旋转半周距离查询找到经过弦的最短路,再二分弦端点","competencyIds":["graph-modeling","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=22"}
59
+ - {"year":2024,"contest":"Hangzhou","problem":"J","model":"按两类卡牌的独有数字集合分解,插板计数与高维前缀和","competencyIds":["math-combinatorics","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=19"}
60
+ - {"year":2024,"contest":"Hangzhou","problem":"K","model":"交换提前最晚标记,逐行统计剩余完成时刻并应用行宽下界","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=5"}
61
+ - {"year":2024,"contest":"Hangzhou","problem":"L","model":"分段 DP 的决策单调性,用连续扩展处理取整平局并定位分界","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=36"}
62
+ - {"year":2024,"contest":"Hangzhou","problem":"M","model":"笛卡尔树归约子数组整除条件,差分 gcd 因数筛选全局平移","competencyIds":["math-combinatorics","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=1893&r=1#page=11"}
63
+ - {"year":2025,"contest":"Shanghai","problem":"A","model":"二分深度与候选树重心消除的交互定位","competencyIds":["graph-modeling","contest-reading"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=10"}
64
+ - {"year":2025,"contest":"Shanghai","problem":"B","model":"二分图异或不变量、奇环修正与生成树DFS构造","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=7"}
65
+ - {"year":2025,"contest":"Shanghai","problem":"C","model":"排列二值化与不平衡倍增的限次数排序构造","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=24"}
66
+ - {"year":2025,"contest":"Shanghai","problem":"D","model":"按位拆分0/1子问题并合并通配三态求和","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=3"}
67
+ - {"year":2025,"contest":"Shanghai","problem":"E","model":"小汉明距离复制树上增量维护对称差并统计可选父亲","competencyIds":["graph-modeling","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=13"}
68
+ - {"year":2025,"contest":"Shanghai","problem":"F","model":"两次扫描线维护凸包并二分判交,处理坐标为零","competencyIds":["math-combinatorics","data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=29"}
69
+ - {"year":2025,"contest":"Shanghai","problem":"G","model":"分组缩至至多两组与总异或掩码下的线性基优化","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=4"}
70
+ - {"year":2025,"contest":"Shanghai","problem":"H","model":"同值配对策略与未配对元素分类的异或博弈","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=5"}
71
+ - {"year":2025,"contest":"Shanghai","problem":"I","model":"保留位置DP与异或高低位分解优化","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=8"}
72
+ - {"year":2025,"contest":"Shanghai","problem":"J","model":"路径前缀闭包与二度化Trie惰性扩展","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=9"}
73
+ - {"year":2025,"contest":"Shanghai","problem":"K","model":"前缀极值单调性分块与三段贡献前缀和","competencyIds":["data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=15"}
74
+ - {"year":2025,"contest":"Shanghai","problem":"L","model":"最左合法切分去重与常数禁切状态的区间DP","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=20"}
75
+ - {"year":2025,"contest":"Shanghai","problem":"M","model":"兄弟叶子异值限制、卡塔兰数容斥与分治计数","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-12-zh.pdf#page=22"}
76
+ - {"year":2025,"contest":"Hong Kong","problem":"A","model":"匹配拟阵的增广替换维护与右端点扫描","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=23"}
77
+ - {"year":2025,"contest":"Hong Kong","problem":"B","model":"单次免费边成路径、双次免费边成完整子树的树形DP","competencyIds":["graph-modeling","dp-modeling"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=14"}
78
+ - {"year":2025,"contest":"Hong Kong","problem":"C","model":"模n余数可达性分层、插板法与生成函数容斥计数","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=27"}
79
+ - {"year":2025,"contest":"Hong Kong","problem":"D","model":"操作时刻逆排列的单调传播DP与李超树直线优化","competencyIds":["dp-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=26"}
80
+ - {"year":2025,"contest":"Hong Kong","problem":"E","model":"邻域大小点集的下凸包与最大权闭合子图切线求解","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=38"}
81
+ - {"year":2025,"contest":"Hong Kong","problem":"F","model":"拓扑定向编码指定环,再用强连通分量与入度剥离解码","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=20"}
82
+ - {"year":2025,"contest":"Hong Kong","problem":"G","model":"单向浇水距离取min与线段树定位对数个更新区间","competencyIds":["data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=17"}
83
+ - {"year":2025,"contest":"Hong Kong","problem":"H","model":"最长公共前缀上下界压缩为相邻同字符判定","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=4"}
84
+ - {"year":2025,"contest":"Hong Kong","problem":"I","model":"多DFS序公共连续子树判定与树/森林区间DP","competencyIds":["graph-modeling","dp-modeling"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=11"}
85
+ - {"year":2025,"contest":"Hong Kong","problem":"J","model":"截止时间约束的逆序最长作业贪心与堆维护","competencyIds":["math-combinatorics","data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=6"}
86
+ - {"year":2025,"contest":"Hong Kong","problem":"K","model":"后继更大元素树、长度哈希与倍增比较循环移位的前缀最大值序列","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=8"}
87
+ - {"year":2025,"contest":"Hong Kong","problem":"L","model":"多边形边粘合的可定向性不变量与并查集欧拉示性数","competencyIds":["math-combinatorics","graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://ucup.ac/tutorials/tutorials-4-14-en.pdf#page=33"}
16
88
  selectionGuidance:
17
- - 先用整场 VP 诊断读题、实现、调试与分工,再用经确认的失败原因选择专题;成功题用作能力基线。
18
- - 采样 A 检查从精确排序规则到实现的转化;D 检查计数状态;E 检查大次数变换与模幂,题名不决定算法。
19
- - 采样 L 检查可行性单调性与贪心证明;F 检查单调栈和并查集组合;K 检查路径与概率模型组合。
20
- - 赛前优先修复已证实、可在剩余时间完成验收的障碍;未证实的缺口先安排短诊断,不直接扩知识点。
21
- - 同一题允许多种正确解法;把能解释条件并独立迁移作为验收,不能将某个算法标签当唯一答案。
89
+ - "中国亚洲区域赛优先使用对应赛站和年份的原题;先诊断读题、模型选择和实现,不按 CF rating 连续解锁知识点。"
90
+ - "当前五站六场共七十题已核对题解:南京2022十三题、2023六题,西安2025十三题、杭州2024十三题、上海2025十三题、香港2025十二题。同题镜像不增加覆盖。"
91
+ - "结合本人和团队 VP 中已确认的失败原因选择本周重点;一道成功题只作为能力起点,不证明同模型已经掌握。"
92
+ - "同一能力跨不同赛站、叙事和约束进行迁移,先让学生自行识别模型;不要为了覆盖样本把所有出现过的知识点依次教完。"
93
+ - "西安目标可以继续使用 xian-pending 配置ID,现已补入2025原题;旧ID不表示样本仍为空。NWERC仅作扩展参考。"
94
+ - "需要更多年份或赛站时按需打开资料索引,先核对原题与题解,候选链接不能充当已审核模型。"
22
95
  limitations:
23
- - 当前算法样本只有 NWERC 2024 的六题,不能推出中国区域赛频率、任何场次金牌题数或西安出题预测。
24
- - 读题时间盒、换题条件、验收动作是插件教学设计,需要按个人与团队记录调整,规则来源不证明这些训练阈值。
25
- - 未采样其余题或跨年份统计;此配置不是西安考纲,排名与奖牌目标仍需对应比赛榜单。
96
+ - "当前只有五站六场的有限样本,南京2023只采六题;未做跨赛区专题频率统计,不能预测本届区域赛或给出专题权重。"
97
+ - "七十题已阅读题解并对照题意,未运行全部解法或交互器。模型和能力对应是教学解释,不是唯一解法、完整考纲或学生掌握证据。"
98
+ - "现场奖牌榜单尚未完整核验;线上重赛榜与现场榜分开,不给出金牌题数或奖牌保证。"
99
+ - "原赛年份以官方赛事别名为准,不因UCup或训练营重赛日期改年;题解页码是实体PDF页序,不能用印刷页脚替代。"
100
+ - "上海A的重赛题面允许40次交互询问,其他版本需重核协议和限制;上海H/I题解记号与题面存在差异,不直接照抄判定或代价式。"
101
+ - "香港K题解概述的字典序方向与正式题面不一致,依题面核对最小方向;香港PDF页脚跳号,采样页码已按实体页修正。"
102
+ - id: nwerc-reference
103
+ title: "区域赛通用能力诊断(NWERC 2024 全卷样本)"
104
+ scope: "用公开区域赛的题面与官方解题建立诊断任务,再结合本人 VP 证据取舍。"
105
+ status: "provisional"
106
+ sources:
107
+ - {"title":"NWERC 2024 官方题面(A–M 全卷)","url":"https://2024.nwerc.eu/main/problem-set.pdf"}
108
+ - {"title":"NWERC 2024 官方解题(A–M 对应页)","url":"https://2024.nwerc.eu/main/solutions.pdf"}
109
+ - {"title":"ICPC NCNA 公布的区域赛规则(通用背景,不提供专题频率)","url":"https://nc.na.icpc.global/rules/"}
110
+ competencyIds: ["contest-reading","contest-decision","implementation-stability","dp-modeling","graph-modeling","data-structures","math-combinatorics","code-review","team-communication"]
111
+ samples:
112
+ - {"year":2024,"contest":"NWERC","problem":"A","model":"自定义排序规则","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=4"}
113
+ - {"year":2024,"contest":"NWERC","problem":"B","model":"周期标号游走与状态动态规划,题名不能决定算法","competencyIds":["graph-modeling","dp-modeling"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=24"}
114
+ - {"year":2024,"contest":"NWERC","problem":"C","model":"网格极端点收缩与几何分类","competencyIds":["math-combinatorics","graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=19"}
115
+ - {"year":2024,"contest":"NWERC","problem":"D","model":"排序后按最小元素分类计数与背包","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=11"}
116
+ - {"year":2024,"contest":"NWERC","problem":"E","model":"下标变换与模幂","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=8"}
117
+ - {"year":2024,"contest":"NWERC","problem":"F","model":"单调栈和并查集跳过已满位置","competencyIds":["data-structures"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=13"}
118
+ - {"year":2024,"contest":"NWERC","problem":"G","model":"双连通分量与排列奇偶性","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=31"}
119
+ - {"year":2024,"contest":"NWERC","problem":"H","model":"交互函数迭代的等式构造,存在多种解法","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=16"}
120
+ - {"year":2024,"contest":"NWERC","problem":"I","model":"素数指数参数化与容斥预处理","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=28"}
121
+ - {"year":2024,"contest":"NWERC","problem":"J","model":"独立优化与最近更高障碍限制","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=7"}
122
+ - {"year":2024,"contest":"NWERC","problem":"K","model":"最短路与按距离排序的概率期望","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=15"}
123
+ - {"year":2024,"contest":"NWERC","problem":"L","model":"单调可行性与贪心配对二分","competencyIds":["contest-reading","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=10"}
124
+ - {"year":2024,"contest":"NWERC","problem":"M","model":"期望线性性与面积前后缀求和,检查整数溢出","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://2024.nwerc.eu/main/solutions.pdf#page=22"}
125
+ selectionGuidance:
126
+ - "先用整场 VP 诊断读题、实现、调试与分工,再用经确认的失败原因选择专题;成功题用作能力基线。"
127
+ - "采样 A 检查从精确排序规则到实现的转化;D 检查计数状态;E 检查大次数变换与模幂,题名不决定算法。"
128
+ - "采样 L 检查可行性单调性与贪心证明;F 检查单调栈和并查集组合;K 检查路径与概率模型组合。"
129
+ - "赛前优先修复已证实、可在剩余时间完成验收的障碍;未证实的缺口先安排短诊断,不直接扩知识点。"
130
+ - "同一题允许多种正确解法;把能解释条件并独立迁移作为验收,不能将某个算法标签当唯一答案。"
131
+ limitations:
132
+ - "当前算法样本只有 NWERC 2024 的一届全卷十三题,不能推出中国区域赛频率、任何场次金牌题数或西安出题预测。"
133
+ - "读题时间盒、换题条件、验收动作是插件教学设计,需要按个人与团队记录调整,规则来源不证明这些训练阈值。"
134
+ - "未做跨年份统计;此配置不是西安考纲,排名与奖牌目标仍需对应比赛榜单。模型映射是教学解释,官方解题不证明该题在其他赛区高频。"
26
135
  - id: wf-extension
27
- title: WF 扩展能力诊断(题面样本)
28
- scope: 在基础能力稳定后,以 World Finals 原题检查跨模型推理、约束解释和交互实现。
29
- status: provisional
136
+ title: "WF 扩展能力诊断(题面样本)"
137
+ scope: "在基础能力稳定后,以 World Finals 原题检查跨模型推理、约束解释和交互实现。"
138
+ status: "provisional"
30
139
  sources:
31
- - title: ICPC 2024 World Finals 官方题面(采样 B、I、L)
32
- url: https://icpc.global/worldfinals/problems/2024-ICPC-World-Finals/icpc2024.pdf
33
- - title: ICPC 2024 交互题评测说明(输出刷新等要求)
34
- url: https://docs.icpc.global/wp-content/uploads/2024/08/2024-JudgingNotes.pdf
35
- competencyIds: [contest-reading, contest-decision, dp-modeling, graph-modeling, data-structures, math-combinatorics, code-review, team-communication]
140
+ - {"title":"ICPC 2024 World Finals 官方题面(采样 B、I、L)","url":"https://icpc.global/worldfinals/problems/2024-ICPC-World-Finals/icpc2024.pdf"}
141
+ - {"title":"ICPC 2024 交互题评测说明(输出刷新等要求)","url":"https://docs.icpc.global/wp-content/uploads/2024/08/2024-JudgingNotes.pdf"}
142
+ competencyIds: ["contest-reading","contest-decision","dp-modeling","graph-modeling","data-structures","math-combinatorics","code-review","team-communication"]
143
+ samples:
144
+ - {"year":2024,"contest":"World Finals","problem":"B","model":"概率对象与事件依赖诊断,题解尚未核验","competencyIds":["math-combinatorics"],"solutionReviewed":false,"sourceUrl":"https://icpc.global/worldfinals/problems/2024-ICPC-World-Finals/icpc2024.pdf"}
145
+ - {"year":2024,"contest":"World Finals","problem":"I","model":"树上覆盖目标建模,题解尚未核验","competencyIds":["graph-modeling"],"solutionReviewed":false,"sourceUrl":"https://icpc.global/worldfinals/problems/2024-ICPC-World-Finals/icpc2024.pdf"}
146
+ - {"year":2024,"contest":"World Finals","problem":"L","model":"交互信息状态诊断,策略尚未核验","competencyIds":["contest-reading"],"solutionReviewed":false,"sourceUrl":"https://icpc.global/worldfinals/problems/2024-ICPC-World-Finals/icpc2024.pdf"}
36
147
  selectionGuidance:
37
- - 采样 B 用于检查概率对象、重复元素与事件依赖的精确表达;不能仅凭概率题标签选一个模板。
38
- - 采样 I 用于检查树上覆盖目标与最坏响应时间的建模,要求先解释判定或优化方案再实现。
39
- - 采样 L 用于检查未知位置与朝向下的信息状态、安全动作和终止条件;交互程序必须按评测说明刷新输出。
40
- - 只有当前基础能力经新题和延迟复测确认后,才将此样本中的扩展任务转为主线;短期比赛可保留为旁线讨论。
148
+ - "采样 B 用于检查概率对象、重复元素与事件依赖的精确表达;不能仅凭概率题标签选一个模板。"
149
+ - "采样 I 用于检查树上覆盖目标与最坏响应时间的建模,要求先解释判定或优化方案再实现。"
150
+ - "采样 L 用于检查未知位置与朝向下的信息状态、安全动作和终止条件;交互程序必须按评测说明刷新输出。"
151
+ - "只有当前基础能力经新题和延迟复测确认后,才将此样本中的扩展任务转为主线;短期比赛可保留为旁线讨论。"
41
152
  limitations:
42
- - 当前只有 2024 WF 三道题面样本,未核验这些题的完整官方题解;能力映射是教学诊断推断,不是唯一解法。
43
- - 不能从样本推出 WF 录取标准、区域赛奖牌线或必备专题全表;不把 CF rating 当作阶段通过证据。
44
- - 不用未验证的交互策略宣称可通过;需要对应交互器与完整程序验证。
153
+ - "当前只有 2024 WF 三道题面样本,未核验这些题的完整官方题解;能力映射是教学诊断推断,不是唯一解法。"
154
+ - "不能从样本推出 WF 录取标准、区域赛奖牌线或必备专题全表;不把 CF rating 当作阶段通过证据。"
155
+ - "不用未验证的交互策略宣称可通过;需要对应交互器与完整程序验证。"
45
156
  - id: xian-pending
46
- title: 西安区域赛(待采样)
47
- scope: 为已选西安目标保留真实样本入口;当前只提供通用比赛过程诊断。
48
- status: provisional
157
+ title: "西安区域赛能力诊断(2025全卷样本)"
158
+ scope: "用2025西安区域赛十三道原题及官方题解支持目标诊断;实际备赛取舍结合当前个人、团队和剩余时间。"
159
+ status: "provisional"
49
160
  sources:
50
- - title: QOJ 西安历年比赛目录(仅核验样本入口,未作专题统计)
51
- url: https://qoj.ac/category/87
52
- - title: ICPC NCNA 公布的区域赛规则(通用背景,非西安本届规则)
53
- url: https://nc.na.icpc.global/rules/
54
- competencyIds: [contest-reading, contest-decision, implementation-stability, code-review, team-communication]
161
+ - {"title":"西安2025官方题解(全卷十三题)","url":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1"}
162
+ - {"title":"西安2025原题与赛事身份","url":"https://contest.ucup.ac/contest/2562"}
163
+ - {"title":"QOJ西安历年原题目录","url":"https://qoj.ac/category/87"}
164
+ - {"title":"中国区比赛资料索引(候选入口)","url":"https://github.com/Miantiao1231/acmer-coach/blob/main/docs/china-contest-sources.md"}
165
+ competencyIds: ["contest-reading","contest-decision","implementation-stability","dp-modeling","graph-modeling","data-structures","math-combinatorics","code-review","team-communication"]
166
+ samples:
167
+ - {"year":2025,"contest":"Xi'an","problem":"A","model":"最大攻击者归约与区间覆盖链的线段树动态维护","competencyIds":["contest-reading","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=1"}
168
+ - {"year":2025,"contest":"Xi'an","problem":"B","model":"端点颜色修正的重排判定、双指针最短区间与贪心构造","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=2"}
169
+ - {"year":2025,"contest":"Xi'an","problem":"C","model":"毛毛虫森林判定与双指针维护诱导子图度数","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=4"}
170
+ - {"year":2025,"contest":"Xi'an","problem":"D","model":"前后缀可达点压缩边数,分列选择构造不同共同可达集合","competencyIds":["graph-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=5"}
171
+ - {"year":2025,"contest":"Xi'an","problem":"E","model":"重链剖分把根路径翻转转成前缀,分块统计区间操作的奇偶贡献","competencyIds":["graph-modeling","data-structures"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=6"}
172
+ - {"year":2025,"contest":"Xi'an","problem":"F","model":"单后继依赖形成基环树,从环上首个相遇事件传播停止时间","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=6"}
173
+ - {"year":2025,"contest":"Xi'an","problem":"G","model":"相邻交换论证得到升降序投票贪心","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=7"}
174
+ - {"year":2025,"contest":"Xi'an","problem":"H","model":"黑色连通块计数,EGF、Lagrange 反演与 Stirling 多项式提取系数","competencyIds":["math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=7"}
175
+ - {"year":2025,"contest":"Xi'an","problem":"I","model":"三点路径异或求中心,恢复祖先关系与相邻深度树边","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=8"}
176
+ - {"year":2025,"contest":"Xi'an","problem":"J","model":"购点树形 DP 维护最小和次小子代价,祖先链前缀和回答合并查询","competencyIds":["dp-modeling","graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=8"}
177
+ - {"year":2025,"contest":"Xi'an","problem":"K","model":"按位子集包含的排列匹配,删一位建图压缩网络流","competencyIds":["graph-modeling"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=9"}
178
+ - {"year":2025,"contest":"Xi'an","problem":"L","model":"多边形边长判定、排序连续段与单调指针求各边数最大周长","competencyIds":["math-combinatorics","implementation-stability"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=9"}
179
+ - {"year":2025,"contest":"Xi'an","problem":"M","model":"消空性质分类与补集两状态 DP,区分 1、至少 n 的值和奇偶特例","competencyIds":["dp-modeling","math-combinatorics"],"solutionReviewed":true,"sourceUrl":"https://contest.ucup.ac/download.php?type=attachments&id=2562&r=1#page=10"}
55
180
  selectionGuidance:
56
- - 使用本人和当前团队 VP 的经确认障碍安排短期动作,专题需求暂参考区域赛通用诊断并明示来源。
57
- - 先核验目标届次、原始题面、主办方题解和榜单,再记录逐题模型、可替代解法及样本年份。
58
- - 样本补齐后才修订专题取舍;比赛名和账号 rating 都不能单独生成西安专题权重。
181
+ - "先结合本人和当前队伍的VP记录定位可改善障碍,再用西安2025样本或其他中国赛站新题做短诊断、迁移与限时验收。"
182
+ - "按题意、约束和证明选择模型;贪心、图、DP、数据结构与计数可交叉出现,不能按题号顺序固定开课。"
183
+ - "原配置ID保留,已有目标无需迁移。遇到没有证据的缺口先诊断,旧样本不能自动生成本届专题权重。"
59
184
  limitations:
60
- - 历年目录不能证明某知识点高频;尚未完成西安原题与官方题解逐题采样,不能预测本届题目。
61
- - 此配置不是西安考纲,也未核验目标届次奖牌榜单,不能给出金牌保证或做题数保证。
185
+ - "当前采样2025一届全卷十三题,已核对题意和官方题解;不是西安完整考纲,不能预测本届题目或知识点频率。"
186
+ - "现场榜单和目标届次奖牌名单尚未完整核验,不能给出金牌题数或保证;题解中的通过比例不等于未来出题概率。"
187
+ - "未运行全部程序或独立验证替代解法;样本模型是教学解释,学习保持、迁移和团队表现仍需真实训练记录。"
@@ -1335,7 +1335,7 @@ const SNAP = 5;
1335
1335
  // 块型短名。**必须和 host 的 SCHED_KINDS[k].name 逐字一致** ——
1336
1336
  // 不一致时页面会拿 id 兜底显示(不会崩),但那块看着就像坏了。
1337
1337
  // host 是真相源,这里只管显示。verify.mjs 有一条盯着这个一致性。
1338
- const KIND_NAME = { cycle: "题目循环", review: "复习一题", exam: "章节检测" };
1338
+ const KIND_NAME = { cycle: "题目循环", review: "复习一题", exam: "章节检测", diagnostic: "短诊断", vp: "完整 VP" };
1339
1339
 
1340
1340
  const minToHM = (m) => {
1341
1341
  const t = HOUR_FROM * 60 + m;
@@ -1447,7 +1447,7 @@ function renderSched() {
1447
1447
  const kind = String(b.kind ?? "");
1448
1448
  // 地图改过名、甚至删过节点,而计划是历史数据 ——
1449
1449
  // 查不到名字就退回 id,**不能因为查不到就不画**(那等于计划凭空消失)。
1450
- const nm = byId(b.node)?.name ?? String(b.node ?? "");
1450
+ const nm = b.competency ? `能力:${b.competency}` : byId(b.node)?.name ?? String(b.node ?? "");
1451
1451
  const size = mins >= 75 ? "s-full" : mins >= 40 ? "s-mid" : "s-mini";
1452
1452
  // 中等高度(40~74 分钟,循环块正好 60)挤不下两行,但**时间要留住** ——
1453
1453
  // busy 那边中档只放事由就够(他自己知道标了什么),
@@ -1457,7 +1457,7 @@ function renderSched() {
1457
1457
  ? `<span class="t">${esc(b.from)}–${esc(b.to)}</span>${esc(nm)}`
1458
1458
  : size === "s-mid" ? `${esc(b.from)} ${esc(nm)}` : "";
1459
1459
  const tip = `${b.from}–${b.to} ${KIND_NAME[kind] ?? kind} ${nm}` +
1460
- (kind === "cycle" ? " (40 自己做 → 10 解决遗留 → 10 重写)" : "");
1460
+ (kind === "cycle" && mins === 60 ? " (40 自己做 → 10 解决遗留 → 10 重写)" : "");
1461
1461
  return `<div class="pbar k-${esc(kind)} ${size}" title="${esc(tip)}" ` +
1462
1462
  `style="top:${pct(a)};height:${pct(mins)}">${body}</div>`;
1463
1463
  }).join("");
@@ -13,8 +13,12 @@
13
13
  比赛目标不能悄悄覆盖长期目标。赛前在剩余实际容量内选择可验收的改善,赛后再按新
14
14
  证据修订;日期只提供约束,不证明某专题该学。无法装进预算时说明暂缓什么与代价。
15
15
  * `coach_target profiles` 提供有来源和样本限制的配置,再按需设置 `profileId`。
16
+ `samples` 是逐题模型与来源,`coverage` 是已核验覆盖;零样本就是没有依据。根据题目
17
+ 条件选模型,不能从题名或一次样本计数推出必考、高频或完整考纲。
16
18
  provisional 表示有限样本或尚待取样,不能称官方考纲、预测本届高频专题或保证奖牌。
17
19
  不因某知识点“低频”就永久排除,不把同一道题的某一种解法当唯一算法标签。
20
+ 更多赛站可按需查看 profile 来源里的中国区资料索引。索引链接是候选,先核对年份、
21
+ 赛站、原题和题解;同题镜像不重复算覆盖。现场榜与线上重赛榜分开,不从后者推奖牌线。
18
22
  * 原始 VP 判题、耗时和提交是观察;WA 不等于不会,AC 不证明独立完成。先用
19
23
  `coach_curriculum assess` 取事实引用,再在 `coach_postmortem findings` 记录 hypothesis。
20
24
  查代码/回放核实后才用 confirmed,引用本场真实事实并解释原因;resolved 需要独立成功
@@ -402,6 +406,12 @@
402
406
 
403
407
  ### 二、验收:什么才算"会了"
404
408
 
409
+ * `coach_grade` 的 `passed` 只表示卷面分数和限时通过;本次做出题的 `independent`
410
+ 全部明确为 true 才新增 `verified`。未知就留未知,提示或题解帮助不能补成独立。
411
+ 节点 verified 不是保持率或迁移能力证明;这些按课程现有 `exitChecks` 分别验收。
412
+ 短诊断和整场 VP 可用 `coach_assign` 绑定真实 competency,再用 `coach_log` 记录
413
+ 实际交付物与独立性;计划、时长和一次交付物通过都不证明该能力全面掌握。
414
+
405
415
  * 只有 **无提示 + 换皮题(同知识点、他没练过的题)+ 间隔 ≥1 天** 的表现才算数;
406
416
  带提示做对的,**不计入"已验证"**。
407
417
  依据:延迟 1–6 天后测的效应 g=0.82,当天测只有 0.56(Adesope 2017,272 个效应量)。
@@ -1335,7 +1335,7 @@ const SNAP = 5;
1335
1335
  // 块型短名。**必须和 host 的 SCHED_KINDS[k].name 逐字一致** ——
1336
1336
  // 不一致时页面会拿 id 兜底显示(不会崩),但那块看着就像坏了。
1337
1337
  // host 是真相源,这里只管显示。verify.mjs 有一条盯着这个一致性。
1338
- const KIND_NAME = { cycle: "题目循环", review: "复习一题", exam: "章节检测" };
1338
+ const KIND_NAME = { cycle: "题目循环", review: "复习一题", exam: "章节检测", diagnostic: "短诊断", vp: "完整 VP" };
1339
1339
 
1340
1340
  const minToHM = (m) => {
1341
1341
  const t = HOUR_FROM * 60 + m;
@@ -1447,7 +1447,7 @@ function renderSched() {
1447
1447
  const kind = String(b.kind ?? "");
1448
1448
  // 地图改过名、甚至删过节点,而计划是历史数据 ——
1449
1449
  // 查不到名字就退回 id,**不能因为查不到就不画**(那等于计划凭空消失)。
1450
- const nm = byId(b.node)?.name ?? String(b.node ?? "");
1450
+ const nm = b.competency ? `能力:${b.competency}` : byId(b.node)?.name ?? String(b.node ?? "");
1451
1451
  const size = mins >= 75 ? "s-full" : mins >= 40 ? "s-mid" : "s-mini";
1452
1452
  // 中等高度(40~74 分钟,循环块正好 60)挤不下两行,但**时间要留住** ——
1453
1453
  // busy 那边中档只放事由就够(他自己知道标了什么),
@@ -1457,7 +1457,7 @@ function renderSched() {
1457
1457
  ? `<span class="t">${esc(b.from)}–${esc(b.to)}</span>${esc(nm)}`
1458
1458
  : size === "s-mid" ? `${esc(b.from)} ${esc(nm)}` : "";
1459
1459
  const tip = `${b.from}–${b.to} ${KIND_NAME[kind] ?? kind} ${nm}` +
1460
- (kind === "cycle" ? " (40 自己做 → 10 解决遗留 → 10 重写)" : "");
1460
+ (kind === "cycle" && mins === 60 ? " (40 自己做 → 10 解决遗留 → 10 重写)" : "");
1461
1461
  return `<div class="pbar k-${esc(kind)} ${size}" title="${esc(tip)}" ` +
1462
1462
  `style="top:${pct(a)};height:${pct(mins)}">${body}</div>`;
1463
1463
  }).join("");
@@ -2,6 +2,11 @@ import test from 'node:test'
2
2
  import assert from 'node:assert/strict'
3
3
  import { readFileSync } from 'node:fs'
4
4
  import YAML from 'yaml'
5
+ import { mkdtempSync, rmSync } from 'node:fs'
6
+ import { tmpdir } from 'node:os'
7
+ import { join } from 'node:path'
8
+ import { fileURLToPath } from 'node:url'
9
+ import { createStrategyStore } from '../lib/strategy.js'
5
10
 
6
11
  const knowledge = new URL('../assets/knowledge/', import.meta.url)
7
12
  const read = name => YAML.parse(readFileSync(new URL(name, knowledge), 'utf8'))
@@ -14,7 +19,15 @@ function sources(value, label) {
14
19
  assert.ok(typeof source.title === 'string' && source.title.trim(), `${label}: source title required`)
15
20
  const url = new URL(source.url)
16
21
  assert.equal(url.protocol, 'https:', `${label}: public HTTPS source required`)
17
- assert.ok(!url.username && !url.password && !url.search, `${label}: no account credentials or query data`)
22
+ assert.ok(!url.username && !url.password, `${label}: no account credentials`)
23
+ if (url.search) {
24
+ assert.equal(url.hostname, 'contest.ucup.ac', `${label}: only public official attachments may use query parameters`)
25
+ assert.equal(url.pathname, '/download.php')
26
+ assert.deepEqual([...url.searchParams.keys()].sort(), ['id', 'r', 'type'])
27
+ assert.equal(url.searchParams.get('type'), 'attachments')
28
+ assert.match(url.searchParams.get('id'), /^\d+$/)
29
+ assert.match(url.searchParams.get('r'), /^\d+$/)
30
+ }
18
31
  assert.ok(url.pathname !== '/', `${label}: link to evidence, not a homepage`)
19
32
  }
20
33
  }
@@ -24,6 +37,64 @@ function textList(value, label) {
24
37
  assert.ok(value.every(item => typeof item === 'string' && item.trim()), `${label}: text required`)
25
38
  }
26
39
 
40
+ test('contest evidence exposes actual reviewed samples, never a complete syllabus', () => {
41
+ const dir = mkdtempSync(join(tmpdir(), 'coach-samples-'))
42
+ try {
43
+ const store = createStrategyStore({ dataDir: dir, competenciesPath: fileURLToPath(new URL('COMPETENCIES.yaml', knowledge)) })
44
+ const profiles = store.target('profiles').availableProfiles
45
+ const regional = profiles.find(profile => profile.id === 'regional-diagnostic')
46
+ assert.equal(regional.coverage.sampledProblems, 70)
47
+ assert.equal(regional.coverage.reviewedSolutions, 70)
48
+ assert.deepEqual(regional.coverage.years, [2022, 2023, 2024, 2025])
49
+ assert.equal(regional.coverage.isSyllabus, false)
50
+ assert.deepEqual(regional.samples.filter(sample => sample.year === 2022).map(sample => sample.problem).sort(), [...'ABCDEFGHIJKLM'])
51
+ assert.equal(new Set(regional.samples.map(sample => `${sample.contest}:${sample.year}:${sample.problem}`)).size, 70)
52
+ const additions = [
53
+ ["Xi'an", 2025, 'ABCDEFGHIJKLM', 'contest.ucup.ac', '/download.php'],
54
+ ['Hangzhou', 2024, 'ABCDEFGHIJKLM', 'contest.ucup.ac', '/download.php'],
55
+ ['Shanghai', 2025, 'ABCDEFGHIJKLM', 'ucup.ac', '/tutorials/tutorials-4-12-zh.pdf'],
56
+ ['Hong Kong', 2025, 'ABCDEFGHIJKL', 'ucup.ac', '/tutorials/tutorials-4-14-en.pdf'],
57
+ ]
58
+ for (const [city, year, letters, host, pathname] of additions) {
59
+ const samples = regional.samples.filter(sample => sample.contest === city && sample.year === year)
60
+ assert.deepEqual(samples.map(sample => sample.problem).sort(), [...letters], `${city}: reviewed full paper`)
61
+ for (const sample of samples) {
62
+ const url = new URL(sample.sourceUrl)
63
+ assert.equal(url.hostname, host)
64
+ assert.equal(url.pathname, pathname)
65
+ assert.match(url.hash, /^#page=[1-9]\d*$/)
66
+ if (city === "Xi'an" || city === 'Hangzhou') {
67
+ assert.equal(url.searchParams.get('type'), 'attachments')
68
+ assert.equal(url.searchParams.get('id'), city === "Xi'an" ? '2562' : '1893')
69
+ assert.equal(url.searchParams.get('r'), '1')
70
+ }
71
+ }
72
+ }
73
+ assert.match(regional.title, /中国|亚洲/)
74
+ for (const sample of regional.samples) {
75
+ assert.ok(sample.model && sample.solutionReviewed)
76
+ if (sample.contest === 'Nanjing') assert.match(sample.sourceUrl, sample.year === 2022
77
+ ? /^https:\/\/sua\.ac\/wiki\/2022-icpc-nanjing\/tutorial-sketch-zh\.pdf#page=\d+$/
78
+ : /^https:\/\/universal-cup-website\.qoj\.ac\/files\/ucup\/tutorials\/tutorials-2-11\.pdf#page=\d+$/)
79
+ assert.ok(sample.competencyIds.every(id => competencies.some(card => card.id === id)))
80
+ }
81
+ const xian = profiles.find(profile => profile.id === 'xian-pending')
82
+ assert.equal(xian.coverage.sampledProblems, 13)
83
+ assert.equal(xian.coverage.reviewedSolutions, 13)
84
+ assert.deepEqual(xian.coverage.years, [2025])
85
+ assert.deepEqual(xian.samples, regional.samples.filter(sample => sample.contest === "Xi'an"))
86
+ assert.equal(xian.coverage.isSyllabus, false)
87
+ assert.equal(store.target('set', { expectedRevision: 0, contest: '区域赛', date: '2026-10-17', result: '稳定', profileId: regional.id, weeklyHours: 25,
88
+ priorities: [{ id: 'graph-modeling', weight: 10 }] }).ok, true)
89
+ assert.equal(store.focus().profile.coverage.sampledProblems, 70)
90
+ assert.equal(store.target('set', { expectedRevision: 1, contest: '西安区域赛', date: '2026-10-17', result: '稳定', profileId: 'xian-pending', weeklyHours: 25,
91
+ priorities: [{ id: 'graph-modeling', weight: 10 }] }).ok, true)
92
+ assert.equal(store.focus().profile.coverage.reviewedSolutions, 13)
93
+ assert.equal(store.focus().profile.id, 'xian-pending')
94
+ assert.equal(profiles.find(profile => profile.id === 'nwerc-reference').coverage.reviewedSolutions, 13)
95
+ } finally { rmSync(dir, { recursive: true, force: true }) }
96
+ })
97
+
27
98
  test('node teaching cards use exact map nodes and contain sourced transfer boundaries', () => {
28
99
  const catalog = read('NODE_SCOPES.yaml')
29
100
  assert.equal(catalog.version, 1)
@@ -17,6 +17,24 @@ const practice = (extra = {}) => ({ date, problemId: '1234A', solved: false,
17
17
  independent: true, minutes: 40, ...extra })
18
18
  const progress = (nodeRecord, node = '区间 DP') => ({ nodes: { [node]: nodeRecord } })
19
19
  const rowsFor = (record) => collectEvidence(progress(record))
20
+
21
+ test('competency diagnostics and VP completions become facts without fake knowledge nodes', () => {
22
+ const schedule = { days: { [date]: { actual: [
23
+ { node: '', competency: 'contest-reading', kind: 'diagnostic', actualMin: 15, solved: true, independent: true, problemId: 'probe' },
24
+ { node: '', competency: 'contest-decision', kind: 'vp', actualMin: 300, solved: false, independent: true, problemId: 'probe' },
25
+ ] } } }
26
+ const rows = collectEvidence({}, schedule)
27
+ assert.equal(rows.length, 2)
28
+ assert.equal(rows[0].node, '')
29
+ assert.equal(rows[0].competency, 'contest-reading')
30
+ assert.equal(rows[0].minutes, 15)
31
+ assert.equal(rows[0].signal, 'baseline')
32
+ assert.equal(rows[1].competency, 'contest-decision')
33
+ assert.equal(rows[1].signal, 'gap')
34
+ assert.notEqual(rows[0].eventId, rows[1].eventId)
35
+ assert.deepEqual(collectEvidence({}, { days: { [date]: { actual: [{ ...schedule.days[date].actual[0], independent: 'yes' }] } } }), [])
36
+ assert.deepEqual(collectEvidence({ pendingActions: { 'competency:contest-reading': { kind: 'diagnostic', minutes: 15 } } }), [])
37
+ })
20
38
  const reverseKeys = (value) => Array.isArray(value) ? value.map(reverseKeys)
21
39
  : value && typeof value === 'object'
22
40
  ? Object.fromEntries(Object.entries(value).reverse().map(([key, item]) => [key, reverseKeys(item)]))