2026 暑期集训(6.23-7.31 8.10-)
7.14-7.15 计数专题
P13259 [GCJ 2014 #2] Trie Sharding
Trie 最优方案计数 颜色覆盖
题意:把大小为 \(M\) 的字符串集合 \(S\) 分成 \(N\) 个集合 \(T_1,T_2,...,T_N\),每个集合建一颗 Trie 树,求最大节点总数及使得节点数最大的方案数(对 \(1e9+7\) 取余)。
\(1≤M≤10^3\),\(1≤N≤10^2\)。
题解
对 \(S\) 建一棵 Trie,点 \(x\) 最大贡献为 \(\min(N,size_x)\)。
对节点染色,\(1≤col≤N\),要求 \(x\) 子树内颜色数 \(=\min(N,size_x)\),则最大节点数 \(=\sum_u \min(N,size_x)。\)
于是树形 DP。
若 \(size_x<N\)
\(dp_x=\frac{N!}{(N-size_x)!}\)。
若 \(size_x≥N\)
节点 \(x\) 的直接部分为每个儿子子树(大小为其包含完整字符串的数量)及在 \(x\) 结束的字符串(令其大小为 \(1\),方案数为 \(P(N,1)=N\)),设这些大小分别为 \(s_1,s_2,...,s_k\)。
A.存在一个直接部分 \(s_y≥N\),\(dp_x=\prod_{y}dp_y\)。
B.所有直接部分 \(\max_{y} s_y<N\),每个部分内部排方案数为 \(s_i!\),选择 \(j\) 种颜色不用(方案数 \(\binom{N}{j}\)),每个部分选择颜色方案数 \(\binom{N-j}{s_i}\),则颜色方案数为 \(\sum^{N}_{j=0}(-1)^j\binom{N}{j}\prod_{i}\binom{N-j}{s_i}\),因此 \(dp_x=(\prod_{i}s_i!)\sum^{N}_{j=0}(-1)^j\binom{N}{j}\prod_{i}\binom{N-j}{s_i}\)。
7.16 模拟赛+ABC466
ABC466C
题目
双指针,🌰交互卡了我好久。
ABC466F
题目
给定 $ T $ 组测试数据,每组包含整数 $ N, X $ 和长度为 $ N $ 的正整数序列 $ A = (A_1, A_2, \dots, A_N) $。
对非负整数 $ x $,定义
请对每组数据,求满足 $ 1 \leq x \leq X $ 且 $ f(x) = 0 $ 的整数 $ x $ 的个数。
数据范围:$ 1 \leq T \leq 2 \times 10^5 $,所有测试中 $ N $ 之和不超过 \(2 \times 10^5\),\(1 \leq N \leq 2 \times 10^5\),\(1 \leq X, A_i \leq 10^{18}\)
题解
发现 \(a_i\) 大于等于 \(\min_{j=1}^{i-1}a_j\) 则无用,于是把原序列 \(a_1,a_2,...,a_n\) 删成单调递减序列 \(b_1,b_2,...,b_m\)。
\(g(i,L)\) 表示所有 \(0,1,...,L\) 在对 \(b_i,b_{i+1},...,b_m\) 取模后变成 0 的个数。
若 \(L<\min_{j=i}^{m}b_j\) 则 \(g(i,L)=0\);
否则找到第一个 \(b_j≤L\),分成完整的 \(\lfloor\frac{L}{b_j}\rfloor\) 个块,再单独求剩下的 \(L\bmod b_j\),
\(g(i,L)=\lfloor\frac{L}{b_j}\rfloor*g(j,L)+g(j,L\bmod b_j)\)。
7.17-7.18 图论+ABC465+ABC464
就比平时晚睡半小时,为何头痛欲裂>﹏<。
ABC465F
高维(六维)前缀和
预处理:
for(int d=0,s=1;d<6;d++){
for(int i=1;i<=1e6;i++)
if((i/s)%10) a[i]+=a[i-s];
s=s*10;
}
求值:
for(int S=0;S<(1<<6);S++){
int tmp[6]={0};char flag=0;
for(int i=0;i<6;i++){
if((S>>i)&1){
tmp[i]=l[i]-1;
if(tmp[i]<0){flag=1;break;}
}else tmp[i]=r[i];
}
if(flag) continue;
int id=0;
for(int i=0;i<6;i++) id=id*10+tmp[i];
if(__builtin_popcount(S)&1) ans-=a[id];
else ans+=a[id];
}
P12737 可变方向道路 Vari-directional Streets
图论 SCC 拓扑排序
题意
\(N\) 个点 \(M\) 条边的有向图,求在原图中能到达所有点或在反向图中能到达所有点的点集。
\(1≤N≤5×10^5\),\(1≤M≤10^6\)。
题解
对于满足条件的点 \(x\),条件可以转化成
SCC 中点互相可达,于是 Tarjan 缩点。
再拓扑排序,给 SCC 重新编号,使得每个 SCC 不能被大于自己编号的任意点到达且不能到达小于自己编号的任意点。
先在缩点后的图上跑一遍编号字典序大优先的拓扑排序,记录 \(rk1\),再在缩点后的图的反向图上跑一遍编号字典序小优先的拓扑排序,记为 \(rk2\)。
于是满足条件的 SCC 的编号 \(x\) 一定满足
7.20 模拟赛
7.21-7.22 ABC463+ABC467+组合+定时
组合
有标号树与 \(Prüfer\) 序列
\(m\) 个有标号点上的无根树与长为 \(m-2\) 且字符取 \(1,2,...,m-2\) 的 \(Prüfer\) 序列一一对应,因此树数为 \(m^{m-2}\)。
ABC463E
题目 单源最短路但是也可使用传送门,\(x\) 到 \(y\) 花费 \(X_x+X_y+Y\)。
解法
法1:建超级点
法2:三个优先队列,一个维护 \(dis_x\) 最优,两个维护 \(X_x+Y+dis_x+X_y\) 最优(场上猎奇做法,没调出来,赛后 3min A)
法3:找到一个 \(dis1_x+a_x\) 最小的点 \(mn\),再跑一遍 Dijkstra,答案为 \(\min(dis1_x,dismn_x+Y+X_x)\)
ABC463F
题目
\(2N\) 名选手,\(2i-1\) 与 \(2i\) 打一场,胜率相等,在此之前已胜 \(a_i\) 场,冠军将在最终胜场最多的选手中等概率选择,求每名选手得冠的概率,对 \(998244353\) 取模。
解法
当前最高胜场为 \(W\),选手分为三类,\(H\) 当前胜场为 \(W\),\(M\) 当前胜场为 \(W-1\),剩下为 \(O\)。
则组合有六类:\(H,H\)(\(m0\) 个),\(H,M\)(\(m1\) 个),\(H,O\)(\(m2\) 个),\(M,M\)(\(m3\) 个),\(M,O\)(\(m4\) 个),\(O,O\)(\(m5\) 个)。
冠军胜场只可能为 \(W\) 和 \(W+1\)。
设函数 \(f(c,t)=2^{-t}\sum_{i=0}^{t}\binom{t}{i}\frac{1}{c+i}\) 表示有 \(c\) 个铁定候选人和 \(t\) 个概率为 \(\frac{1}{2}\) 的待定候选人。
冠军胜场为 \(W+1\) 时,\(H,H\) 分别有贡献 \(\frac{1}{2}f(m0,m1+m2)\),\(H,M\) 和 \(H,O\) 的 \(H\) 分别有贡献 \(\frac{1}{2}f(m0+1,m1+m2-1)\)。
冠军胜场为 \(W\) 时(\(m0\) 必须为0),总数 \(B=2m1+m2+m3\),\(H\) 负的概率 \(R=2^{-(m1+m2)}\),
则 \(H,M\) 的 \(H\)、\(M\) 和 \(H,O\) 的 \(H\) 贡献分别为 \(Rf(B,m4)\),\(M,M\) 贡献分别为 \(\frac{1}{2}Rf(B,m4)\),\(M,O\) 的 \(M\) 贡献为 \(Rf(B+1,m4-1)\)。
其余情况贡献为 \(0\)。
ABC467E
拼尽全力未看懂题解,未来老己记得重看一遍。
becoder Card Flipping
题目
给 \(N\) 张卡片,可选颜色 \(a_i\) 或 \(b_i\) 求最终卡片不同颜色数。
\(N≤2×10^5\),\(0≤a_i,b_i≤1×10^6\)
解法
最初思路为给每个颜色出现次数从小到大排序,找到第一个未涂色的卡片并涂上当前颜色,喜提 \(0pts\)。
发现每次给卡片涂色后会使卡片的另一颜色出现次数 \(-1\),于是线段树维护区间最小值,把出现了当前颜色的卡片放进 vector,每次找到出现次数最小的颜色并给出现当前颜色且未涂色的卡片涂色,答案 \(+1\),将其出现次数赋为 \(INF\),并将此卡片的另一个颜色(如果和当前颜色不同)出现次数 \(-1\)。
becoder 彩色彈珠
题目
给定长度为 \(N\) 的序列 \(a_1,a_2,...,a_N\),求子区间内最多有多少个只在当前子区间出现过一次的数。
\(N≤3×10^5\),\(1≤a_i≤N\)。
解法
\(lst_i\) 存上一次 \(a_i\) 出现的位置,线段树维护区间最大值,每次在 \([lst_{lst_i}+1,lst_i]\) 减 \(1\),在 \([lst_i+1,i]\) 加 \(1\),则区间 \([1,i]\) 的最大值就是以 \(i\) 为右端点的区间最大贡献,答案取 \(\max\) 即可。
7.23 模拟赛
100+100+0+0=200,rk13,依旧被 hyn 拉爆并被 cyb 单调队列。
becoder 最长上升子序列
题目
给定长度为 \(N\)(\(2≤N≤1×10^31\))的数组 \(a_1<a_2<...<a_N\)(\(1≤a_i≤10^18\)),一次操作为 \(b=a\),给 \(b\) 排序并将相邻两数的平均值(如果 \(a\) 中没有)放进 \(a\),直到没有新数生成,求最终 \(a\) 中的最长上升子序列长度。
解法
抽象成一棵树,讨论三种情况




7.24-7.25 ABC462+ABC461
7.24 打完 ABC462 头痛请假回家。
ABC461E
题目
一个 \(N×N\) 的白色矩阵,对其进行 \(M\) 个操作,把 \(x\) 行涂成黑色或 \(y\) 列涂成白色,每次操作后求矩阵上黑色方块数。
\(1≤N,M≤3×10^5\),\(1≤x,y≤N\)。
解法
对于列、行分别开一个树状数组,维护时间 \(l\sim r\) 有多少不同列/行被改变,用两个 \(lst_x\) 记录上一次修改 \(x\) 行/列的时间。
每次树状数组上 \(lst_x\) 减一,当前时间加一,\(lst_x\) 改为当前时间,要特判第一次把某行涂成黑色时答案加 \(N\)。
ABC461F
题目
给定 \(N\)(\(1≤N≤10^{10}\)),求元素互不相同、乘积为 \(N\) 的序列的所有元素之和,对 \(998244353\) 取模。
解法
求出 \(N\) 的所有因数 \(d_1,d_2,...,d_M\) 后,考虑 DP。
定义 \(dp1_{i,j,k}\) 为在 \(d_1,d_2,...,d_i\) 中选 \(j\) 个数乘积为 \(d_k\) 的方案数。
定义 \(dp2_{i,j,k}\) 为在 \(d_1,d_2,...,d_i\) 中选 \(j\) 个数乘积为 \(d_k\) 的所有方案的数的和。
转移式 \(dp1_{i,j,k}=dp1_{i-1,j,k}+dp1_{i,j-1,tmp}\),其中 \(d_{tmp}=d_k/d_i\),
\(dp2_{i,j,k}=dp2_{i-1,j,k}+dp2_{i,j-1,k}+dp1_{i,j,k}×d_i\)。
最后答案为 \(\sum_{j=1}^{m}dp2_{m,j,m}×j!\),由于序列有顺序,是排列而非组合,于是乘上 \(j!\)。
\(i\) 这一维可以被滚掉,因为元素互不相同且乘积小于等于 \(N\),\(j\) 最多枚举到 \(14\)。
所以时间复杂度 \(O(M^2K)\),空间复杂度 \(O(MK)\),其中 \(M\) 为 \(N\) 的因数数,\(K\) 为 \(K!≥N\) 的最小值。
7.27 模拟赛
0+100+0+10=110,T1做着做着把题目记错了【裂开】,大样例重度依赖导致一遇水的大样例就炸。
T4 becoder 王的加冕
题目
有 \(N\)(\(1≤N≤3×10^5\))个高 \(h_i\) 的塔,\(Q\)(\(1≤Q≤3×10^5\))次操作,询问 \(l \sim r\) 的积水数(只能使用 \(l \sim r\) 作为挡板)或给 \(l \sim r\) 增加 \(x\) 的高度。
解法
一次查询的 \(ans=\sum_{i=l}^{r}h_i-\min(\max_{j=l}^{i}h_j,\max_{j=i}^{r}h_j)\)。
定义 \(pre_i=\max_{j=l}^{i}h_j\),\(suf_i=\max_{j=i}^{r}h_j\),\(mx=\max_{j=l}^{r}h_j\),因此 \(ans=\sum_{i=l}^{r}h_i-\min(pre_i,suf_i)\)。
由 \(min(a,b)=a+b-max(a,b)\),\(mx=max(pre_i,suf_i)\),得
\(pre_i\) 是前缀和最大值,单侧递归线段树板子,\(suf_i\) 用同一结构体再建一棵树维护 \(h_i\) 的翻转序列,
每次修改/查询 \(n-r+1 \sim n-l+1\)

浙公网安备 33010602011771号