做题记录1
CF2152E
妙妙交互。
见到交互题就要想极端询问。
先询问全部,求出此时的“摩天大楼”序列,然后把它们删去,接着询问,一直询问 $n$ 次或删空。
然后假设某个数是第 $i$ 次删除的,它的级别就是 $i$,如果没被删,级别就是 $n+1$。
容易发现级别为 $i$ 的前面一定有级别为 $i-1$ 的,那么在它们之间连边,注意到 $n+1$ 级别前有 $n$ 个,做完了。
不存在级别 $n+1$?有 $n^2+1$ 个数!一定有一次回答了多余 $n+1$ 的数,直接输出!
其实这题是简单的,但交互做的还是少了。
CF2152F
注意清空注意清空清空注意清空清空注意清空
倍增套倍增,挺有意思的。
考虑贪心,设 $nxt_i$ 为满足 $a_{nxt_i}-a_i>k$ 的最小的点,那么选 $l,l+1$,两个数不断向后跳 $nxt$,直到跳出 $r$。
但这样是有问题的,考虑问题在哪里。
发现将这个看成一棵树,跳到 $lca$ 时是错的。
于是倍增,设 $lca_{i,0}$ 为从 $i,i+1$ 开始,跳到的 $lca$,然后转移,$lca_{lca_{i,j-1},j-1} \rightarrow lca_{i,j}$,意义感觉挺好理解,但难以用言语表达出。
于是就做完了,注意边界!
CF2152H1
神仙题。
感觉 H2 是做不出了。
$q$ 很小,可以考虑每次询问拆开做。
设 $f_u$ 为将 $u$ 染成红色后最坏情况的染色方案子树贡献之和。
首先肯定有 $f_u = \displaystyle\ \sum_{\text{v is u's son}} \min(f_{v},w_{u \leftarrow v})$。
那么 $l$ 的限制怎么办?
有一个性质:红色的点一定是联通的。
假设 $fa_u$ 为黄色,那么所有红点就是 $u$ 的子树中了,如果 $f_u+w_{u \rightarrow fa} <l$,就要让其中的点权 $x$ 总共加上 $l-(f_u+w_{u \rightarrow fa})$,由于具体是什么不用关心,所以钦定让 $x_u$ 加上那么多。
由于开始假定 $x$ 全是 $0$,所以将答案加上 $l-(f_u+w_{u \rightarrow fa})$。
同时,要将 $f_u$ 更新为 $l-w_{x \rightarrow fa}$,因为要预留它父亲是红色的贡献。
收获
考验码力和思维的好题,很牛。
首先,每个苹果的生长周期是定值,所以,一个人摘下某个苹果后,下一个摘下的人是固定的,每个人向下一个连边,就变成了一棵基环树,怎么求下一个人呢?考虑到下一个一定是在 $C$ 个时刻之后,所以对于 $i$ 求 $A_i-C$ 在 $\bmod L$ 的意义下前面第一个数。记其下标为 $p_i$。
于是就有了一个基环树(内向)。
给每条边赋值一个边权,值为两个人相差的时间,这个怎么求?其实就是解方程:$T \equiv A_{p_i}-A_i \mod L$ 且 $T \ge C$,令 $a=(A_{p_i}-A_i +L) \bmod L$,易得 $T=a+L( \lfloor \frac{C}{L}\rfloor +[C \bmod L >a]) $。
这样一个苹果是在这个基环树从起点不断跑啦!
-
树上
是简单的。
首先,对每个苹果预处理一个数对 $(id,time)$,表示它第一次被谁摘下和摘下时间。
求出 dfn 序、子树大小和到根的距离,那么对于每棵树上的点 $x$ 实际上满足如下要求的苹果 $k$ 数量:
-
$dfn_x \le dfn_{k_{id}} \le dfn_x+siz_x-1$
-
$dis_{k_{id}}-dis_x + k_{time}\le T$
二维数点即可。
-
环
一样,对每个苹果预处理一个数对 $(id,time)$,表示它第一次被环上的谁摘下和摘下时间。
设遍历环的时间为 $len$,环长为 $s$,环为 $h_0 \leftarrow h_1\leftarrow \dots \leftarrow h_s(h_0)$,做一个前缀和 $sum$,之所以是这个顺序是为了避免后面可能出现对负数取模。
考虑一个数对 $k_{id},k_{time}$ 对 $i$ 的一个询问 $T_i$ 贡献,分类讨论:
-
$id \ge i$,先走过去,然后看看剩下的时间可以走几圈易得为
$\max(0,\lfloor \frac{T_i-(sum_{k_{id}}-sum_{i}+k_{time})}{len}\rfloor+1)$。 -
$id < i$,同理,只是绕了一下,$\max(0,\lfloor \frac{T_i-(len-(sum_{i}-sum_{k_{id}})+k_{time})}{len}\rfloor+1)$,化简一下就是 $\max(0,\lfloor \frac{T_i-(sum_{k_{id}}-sum_{i}+k_{time})}{len}\rfloor)$。
注意到后者是前者减一,考虑前面的。
变一下为 $\lfloor \frac{(T_i+sum_{i})-(sum_{k_{id}}+k_{time})}{len}\rfloor+1$,然后令 $(T_i+sum_{i})$ 为 $Xlen+a$,$(sum_{k_{id}}+k_{time})$ 为 $Ylen+b$,于是原式就是 $X-Y+[a \ge b]$。
trick 加一!
所以扫一遍,对于 $X \ge Y$ 的 $X-Y$ 求和并找出 $a \ge b$ 的数量即可,同样二维数点吗?不是!因为还有 $id<i$!怎么解决?见下面。
对于 $id < i$,由于只差了个 $1$,于是可以容斥一下,先 $+1$ 与上面一起做就是二维数点了。
然后要减去满足 $id<i$ 和 $(T_i+sum_{i}) \ge (sum_{k_{id}}+k_{time})$ 的数对的贡献,继续二维数点即可。
终于做完了!思路似乎确实挺自然,但打起来就是极其恶心,不像是比赛时能做出的题。
总结一下就是分析再二维数点再分析再二维数点再分析再二维数点。
然后就调吧!
CF2147F
学傻了,敲了 1.5h 发现 CH₄ 了(悲)
对于 $i,j$ 如果 $p_i > p_i \lor s_i >s_j$,则 $i$ 能买到 $j$,此时 $i$ 连一条边到 $j$。
注意到一个 SCC 中的商品是等价的,这启发缩点。
考虑缩完点的形态,单看任何一个排列都是竞赛图,所以总体缩完点后它的形态是一条链。
继续挖掘性质,如果对 $p$ 排序,那么发现一个 SCC 中的元素一定是排好序的序列中的连续段!证明是容易的。
于是看看怎么计算答案。
考虑找分割点 $b_i$,满足第 $i$ 段 SCC 是 $[b_{i-1}+1,b_i]$,那么答案就是 $n^2-\sum (b_i-b_{i-1})b_{i-1}$,化简为 $\sum b_i^2-\sum b_i b_{i-1}$。
考虑分界点的性质,一个点是分界点当且仅当排序后左边 $s$ 的最大值小于右边的最小值,由于 $s,p$ 都是排列,于是 $i$ 是分割点当且仅当 $[1,i]$ 的 $c$ 是排列。
考虑记 $sum_i=\sum s_i-i$,是分割点当且仅当 $sum_i=0$,所以交换就是区间改,查询就是维护区间最小值的位置的一些信息,就做完了。
AGC047E
一直都不擅长构造。。
先考虑一个 $O(AB)$ 的东西,就是构造两个 $1$ 序列一个长 $A$,一个长 $B$,然后考虑利用 $1=[1+1>1]$,手动模拟一下卷积即可,可以拿到 $800$ 分。
思考优化,首先 $A,B=0$ 任何操作无意义,所以可以认定 $A+B>0$,只有 $0,1$ 容易联想到二进制,于是将 $2^{0 \sim 30}$ 全造出来,同时可以顺便发现一个重要性质——$a+2^k$ 等价于把 $a$ 加 $k$ 次。现在解决拆分问题。
假设目前 $a$ 正拆分第 $i$ 位,前面拆分为了 $b$,第 $i$ 位满足 $b+2^i \le a$,等价于 $[[b+2^i > a]<1]$,拆分完后就是模拟二进制加法了,利用最上面的结论,$xy=[x+y > 1]$,即可完成。
对于这种看似复杂的问题要尝试归约,思考由上面基础操作可以做,不要畏难!!
高洁
感觉数学能力不行。。。。
分解 $d=\prod p_i^{c_i}$
$v(i)=0$ 是好做的,$\sum i [ord(d) \nmid i]$。
然后考虑 $v(i)=k$ 的情况,即 $i^k$ 的质因子每一项至少位 $c_i$,设 $f_k=\prod p_i^{\lceil \frac{c_i}{k} \rceil}$,那么 $d|i^k$ 的充要就是 $f_k|i$。
容易发现 $f_k \mid f_{k-1}$,所以对于一个 $k$,贡献为 $\sum i^{k+1}[f_k \mid i][f_{k-1} \nmid i]$,拆一下,枚举倍数,$f_{k}^{k+1} \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i^{k+1}[\frac{ f_{k-1}}{f_{k}} \nmid i]$,令 $g_k=\lfloor \frac{f_{k-1}}{f_k}\rfloor$,可以继续化简:
$$
\begin{aligned}
f_{k}^{k+1} \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i^{k+1}[\frac{ f_{k-1}}{f_{k}} \nmid i]
&=f_{k}^{k+1} \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i^{k+1}[g_k \nmid i]\
&=f_{k}^{k+1} \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i^{k+1}(1-[g_k \mid i]) \
&=f_{k}^{k+1}( \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i{k+1}-\sum_{i=1}\rfloor} i^{k+1} [g_k \mid i]) \
&=f_{k}^{k+1}( \sum_{i=1}^{\lfloor \frac{n}{f_k}\rfloor} i{k+1}-g_{k}\sum_{i=1}^{\lfloor \frac{n}{f_kg_k}\rfloor} i^{k+1}) \
\end{aligned}
$$
于是做完了,根本不难,讲题时没第一时间听懂只能说明太菜了。
ABC242h
挺牛的题!各种神秘算法都有。
sub1
$n \le 100,m\le10^4,2s,1024 MB$。
考虑一个 $O(n^2m)$ 的做法。
容易想到 $\min-\max$ 容斥。
$\min(S)$ 即集合内最先被染上的时间,考虑每个区间对答案的贡献,假设有 $g(S)$ 个区间不可以贡献 $S$,那么期望时间就是 $\frac{m}{m-g(S)}$,于是 $\min(S)=\frac{m}{m-g(S)}$。
所以被染上的最大时间 $\max(S)=\sum_{T \in S} (-1)^{|T|-1} \min(T)=\sum_{T \in S} (-1)^{|T|-1} \frac{m}{m-g(T)}$。
设 $f_{i,j}$ 为前 $i$ 个数,选 $j$ 个区间的容斥系数和,有 $f_{i,j}=-\sum_{k=1}^{i-1} f_{k,j-h(k+1,i-1)}$,其中 $h(l,r)$ 是完全被 $[l,r]$ 覆盖的区间个数,即,枚举哪里的区间没被选,直接做就是 $O(n^2m)$。
算答案就是枚举 $g(T)$ 的大小 $j$,用 $f_{n,j}$ 转移即可。
sub2
$n,m \le 4000,2.5s,512 MB$。
时空充裕,考虑 $O(nm\log n)$ 之类的算法。
观察上述转移,考虑用线段树维护,具体的,开 $m$ 棵线段树,按左端点从小到大维护每个区间,每加入一个区间 $[L,R]$,每个 $f_{i,j}(i < L)$ 可以去更新 $f_{k,j+1}(k > R)$,于是对于每个 $j$ 维护一个线段树,维护分裂合并即可。
sub3
$n \le 10^4,m\le100,2s,1024 MB$。
直接套 sub2(逃
考虑一个 $O(nm^2)$ 的做法。
sub4
$n,m \le 3000,5s,4 MB$。
拉格朗日插值优化 sub3 的方法。
CF2135E1
E2 过于神秘无法战胜。。。
先考虑 Easy Version。
思考充要,用经典转换,把 $0$ 视为 $1$,$1$ 视为 $-1$,先求出来前缀和,记为 $S$,于是最后一定有 $\max S$ 个 $0$,$S_n-\max S$ 个 $1$,然后 $\mathrm{rev}$ 后 $0$ 的数量为 $S_n-\min S$,$1$ 就是 $\min S$,化简一下就是 $\max S+\min S=S_n$。
枚举 $\min S=l$ 和 $\max S=r$,考虑这样一个问题:
从 $(0,0)$ 到 $(n,m)$,每次向右上或右下走一步,不能经过 $y=l$ 和 $y=r$ 的方案数($r>l$)。
这个是简单的,考虑经典的反射容斥的标准形式:
从 $(0,0)$ 到 $(n,m)$ 不能经过 $y=x+l$,$y=x+r$ 的方案。
答案为:
$$
f(n,m,l,r)=\sum_{k \in \mathrm{Z^+}} \binom{n+m}{n-k(r-l)}-\binom{n+m}{n-k(r-l)+r}
$$
解决原问题就将坐标系旋转 $45$ 度再缩放一下,$(n,m) \to (\frac{n-m}{2},\frac{n+m}{2})$,于是原问题的 $f(n,m,l,r)$ 就变成了 $\sum_{k \in \mathrm{Z^+}} \binom{n}{\frac{n-m}{2}-k(r-l)}-\binom{n}{\frac{n-m}{2}-k(r-l)+r}$。
回到题目,我们要求恰好碰到,容易容斥求到是 $f(n,m,l,r)-f(n,m,l+1,r)-f(n,m,l,r-1)+f(n,m,l+1,r-1)$。
由于是相似的形式,我们只关心 $f(n,m,l,r)$。
容易发现 $m$ 实际上就是 $r-l$。
枚举 $r-l=t$,注意到上标不变,下标每次加上 $t$,是简单的。
终于做完了!
E2 找时间补吧。
CF2135F
$f(u)$ 表示 $x\to \infty,f_u(x)$。
首先 $f$ 是幂塔的形式,由于 $x \to \infty$,只用关心指数,拆一下式子,$f(x)$ 就等于它子树内左边的链的所有点的右儿子的 $f$ 的积。
将用来表示 $f(x)$ 的数从大到小排序,记为 $G(x)$,有结论:$f(x)>f(v) \Longleftrightarrow G(x)>G(v)$,即 $G(x)$ 的字典序反应了具体大小,证明是容易的,字典序大增长率肯定大。
于是要维护排名,可以用 hash 维护,在线段树上找第一个排名不等的位置,比较排名即可。
发现某个点的 $f$ 值在这棵子树内一定是最大的,所以可以用类似拓扑序一样的东西维护,先将叶子插入堆,每次取出排名最小的更新,然后它父亲的入度减一,如果父亲入度为 $0$,就更新它父亲,相当于一个点在继承右儿子的线段树,再单点修改。
于是是 $O(n \log^2 n)$ 的,被 $O(\frac{n^2}{\log n})$ 的暴力爆踩。
数据结构四做
感觉数据结构方面太菜了,找了四道做做,难度递增。
由乃的玉米田
先无脑莫队。
考虑加、减法怎么做,加法就是 $a+b=x \Longleftrightarrow a=x+(-b)$,于是维护两个 bitset,一个维护 $x$,一个维护 $-x$,查询就给维护 $-x$ 加上一个数,与一下即可。减法同理。
乘法是简单的,$\sqrt{V}$ 分解因数即可。
重点在于除法,暴力枚举倍数是 $\frac{V}{x}$ 的,启发我们根号分治,$> \sqrt{V}$ 的直接暴力枚举倍数,否则只有 $\sqrt{V}$ 个将这样的数,考虑枚举所有 $x < \sqrt{V}$,扫一遍数组,设当前扫到 $i$,记 $lst_x$ 为当前 $x$ 最后一次出现的位置,如果 $x \mid a_i$,看看 $lst_{\frac{a_i}{x}}$ 是否大于某个询问的 $l$,且 $i$ 不大于这个询问的 $r$,那么就是有解的,于是做完了,时间复杂度为 $O((n+q+V)\sqrt{V}+\frac{qV}{\omega})$ 空间为 $O(n+q+\frac{V}{\omega})$,常数小,轻松通过。
等这场战争结束之后
先无脑离散化然后建操作树。
显然有一个很 naive 的做法,设 $f_{x,i}$ 代表以 $x$ 为根的树内在第 $i$ 块的数的个数,即可简单维护,时空均为 $O(n \sqrt{n \log n})$,发现空间炸了。
可以微调块长然后 $f$ 开 short,由于常数极小可以 AC,顺便练练卡空间能力,疯狂优化没用的数组,体验极佳(bushi
文化课
前面两题只是练练手感,现在开始才是正菜。
Ynoi 日常卡时空。。。
考虑一个个连续段,在线段树上维护:当前左边极长的 $\times$ 的段的积,右边极长的 $\times$ 的段的积,全局的和,全局的积,左右的符号,最左最右的数,以及答案。
于是第一个操作就好做了,但区间改数咋办?
每个节点开一个 vector 去存区间里每个乘法连续段的长度,和数量,由于长度互不相同,容易证明只有 $\sqrt n$ 个。
于是就可以做了,然后写完就发现 T 了。
WHY?分析一下是 $O(n \sqrt n \log n)$ 得,$\log$ 来自快速幂。
那怎么办?发现毒瘤 lxl 卡空间,无法用光速幂。。。
但是!我们可以发现每一层存的 $(a,b)$(其中 $a$ 是长度,$b$ 是数量)满足 $a$ 是有序的,所以算指数可以直接借用上一个的在乘上这个与上一个的差来算答案!
时间复杂度就是解这个方程:$\sum x_i= \sqrt n (\forall i,x_i < x_{i+1})$,求 $\sum \log(x_i-x_{i-1})$,可发现是 $\sqrt n$ 的,所以总时间就是 $ O(n \sqrt n)$ 啦。
线段
初看感觉这个求交太神秘了,仔细思考一下:如何在线段树上表示一条线段?维护 $\log$ 个结点太麻烦,可以使用猫树思想!对于线段 $(L,R)$,找到线段树上的区间 $(l,mid,r)$,使 $l \le L \le mid,mid<R \le r$,就可以只用 $O(1)$ 个点表示线段,再来看求交。
对于用来交的线段,找到它 $mid$,那么对于同一个 $mid$ 的线段,就是 $l$ 取 $\max$,$r$ 取 $\min$,可用堆和并查集均摊维护,具体的,维护每一个线段的左右端点和谁一样,删除就一起删。
然后递归下去,可用均摊证明是 $O(n \log^2 n)$ 的,大概就是一个区间只会被并大概 $\log$ 次。
考虑计算贡献,即维护 $\min(r,r_i)-\max(l,l_i)$,用四个树状数组,对于每个左右端点维护数量和数值,即可维护。
算了一下以上四题仅仅是正解(不算用来调试、对拍的代码)总共就敲了 21k,数据结构还是太恐怖了。虽然有 5.1k 是快读。
- 稍微总结一下,均摊思想很重要,有些东西可能乍一看是暴力,但总操作数是对的。分析到一定程度后就看看能不能硬维护了,并选择合适的数据结构。不行就继续分析,维护相同段的话并查集很有用,可以往它想。
2025.11.12 好题
今天讲了一万道题,选几道写写。
奇偶矩阵
先令 $n<m$。
考虑枚举 $n$ 行中有 $a$ 行和为 $1$,$b$ 行和为 $2$,$m$ 列中有 $c$ 列和为 $1$,$d$ 列和为 $2$。
注意到有 $a+b=n,c+d=m,a+2b=c+2d$,故只用枚举其中一个。
枚举了有什么用呢?首先顺序是无关紧要的,故先乘上 $\binom{n}{a} \binom{m}{c}$,然后呢?
记住七字真言:组合意义秒天地!思考组合意义。
考虑把每一列的和分配到行上,组合意义为:有 $m$ 种颜色的小球,其中 $c$ 种颜色各有一个小球,$d$ 种颜色各有两个小球,然后需要把这些小球划分成 $n$ 个大小不超过 $2$ 的非空集合序列,满足同一个集合的球颜色互不相同。(即集合有标号,但同一个集合内的球无标号)
先找到 $c+2d$ 个数所有的排列方案,容易发现是 $\dfrac{(c+2d)!}{2^d}$,然后按顺序放入 $n$ 个集合之中,但是会有如 ${a,a}$,${a,b}$、${b,a}$ 的重复,考虑容斥,枚举有多少集合有重复的,第二种直接乘 $\frac{1}{2^b}$ 即可,于是答案就是:
$$
\sum_{a,b,c,d} \binom{n}{a} \binom{m}{c} \sum_{i} (-1)^i i! \binom{b}{i} \binom{d}{i} \dfrac{(c+2d-2i)!}{2^{b+d-i}}
$$
AGC020F
听说是经典 trick?
考虑断环成链,然后令长度最长的线段的左端点为环的起点,好处是我们不用考虑一条线段把环末尾覆盖再覆盖开头的空的情况,因为一定会被最长的覆盖掉。
注意到坐标可以是实数,单我们是肯定不能做到把所有实数拿来当候选坐标的。
但是由于所有的弧长都是整数,所以我们不关心所有弧起始点的小数部分,我们只关心小数部分之间的大小关系。
故可以 $n!$ 暴力枚举这个大小关系,就相当于离散化了。
问题变成:在区间 $[0,nc)$ 上,有一条已知长度的从 $0$ 开始的线段,另外还有 $n−1$ 条已知长度,且起点 $\bmod n$ 确定的线段,要求这些线段覆盖整个区间的方案数。
剩下的就比较套路了,设 $f_{i,j,S}$ 为前选的状态为 $S$,当前在点 $i$,已经覆盖到了点 $j$ 的方案数。
最后求和再除上 $(n-1)!c^{n-1}$ 即可。
时间复杂度 $O((n-1)!2{n-1}(nc)2)$。
看题解有用神秘多项式做到 $O(3nn2 \log n)$ 或 $O(3nn3)$ 或 $O(4^n n^2)$ 的,直接和 $c$ 无关,太恐怖了。
CF1610G
首先可以转化一下,每次一定是删一个连续的 (),是容易证明的。
于是考虑一个 dp,设 $f_i$ 为答案出在 $i \sim n$ 中,有转移考虑是否删 $i$,为 $f_{i}=\min(s_i+f_{i+1},f_{nxt_i})$,其中 $nxt_{i}$ 为最小的 $j$ 使得 $[i,j)$ 合法。
注意到瓶颈在于字典序的比较,显然可以可持久化加上二分做到两只老哥,但是 1s 时限比较紧而且 CF 机子慢,大概率过不了,思考更优的解法。
注意到 $f$ 之间构成树的关系,于是建树,然后树上倍增加 hash 即可。
最后的台词
很符合我对【数据删除】的想象。
乍一看不太可做啊。
k 不固定挺烦人的,考虑 $k$ 固定的情况。
对于每个长度为 $k$ 的字串,只有它第一次和最后一次出现的位置是有用的,分别记作 $l,r$,故一个串可以被 $(l,r)$ 来表示,容易发现这样的表示时唯一的。
那么就用 $(l,r)$ 来描述一下问题。
初始有 $(l_s,r_s)$,每次可以跳到 $(l',r')$ 其中 $r'\ge l_s$,问多少次能跳到 $(l_t,r_t)$。
容易想到贪心地跳,每次跳到到一个最小的 $l'$ 上去,设 $f_i$ 为 $r\ge i$ 中点最小的 $l$,$f$ 自然就成了一棵树,答案就是 $l_s$ 祖先上第一个比 $r_t$ 小的点了。
离线,将 $k$ 从大到小枚举,求出 $s$ 的后缀数组,当 $k$ 固定时,所有的长为 $k$ 的本质不同的子串将 SA 数组划分成了若干段连续区间,且当 $k$ 减小时,只会产生区间的合并,合并的区间可以通过 height 数组快速找到。不会 SAM。。。QWQ
这样就得到了一个暴力做法:从大往小扫 $k$,同时维护子串对应的区间以及最早和最晚的出现位置。合并子串可以并查集维护。查询暴力跳,其实就可以 AC 了。
考虑优化,用 LCT 维护 $f$ 构成的树,并用珂朵莉树维护 $ f$ 的颜色段,因为 $f$ 不降,区间对某个数取 $\min$ 就相当于区间推平,所以不用吉司机。
在 set 上找到对应区间,左侧的区间向它右边的区间在 LCT 上连边权为 $0$ 的边,然后最后一个区间向 $x$ 连边权为 $1$ 的边。
查询就是 splay 上二分。
Metal Processing Plant
直接做很难,考虑转化成判定性问题。
一下钦定 $D(A) \ge D(B)$。
首先枚举 $D(A)$ 的值,$D(B)$ 是单调的,直接双指针,时间复杂度 $O(n^4)$,卡卡应该就过了。
但做人要有所追求。
有一个神秘奇偶环优化。
将 $d$ 排序,每次相当于加入一条边,先固定 $D(A)$ 取它,如果没有环出现,那么直接二分 $D(B)$,如果有偶环则不用关,因为此时可以二分图染色,$D(A)$ 取不到,有奇环则必须取到,因为无法二分图染色了,$D(A)$ 必须要取,然后直接输出答案即可,时间复杂度 $O(n^3 \log n)$。
aaron0919 直接随机化抢了最优解%%%%%%%
学习 KTT
详见学习笔记。
2025.11.19 好题
Unique Matching
$n$ 个区间是好的和对应的排列都不固定,很烦呢。但我们有一般到特殊的思想想题。
考虑到如果这 $n$ 个区间是好的,那么交换一下几个区间就一定能使其对应的排列为 $1 \sim n$,所以不妨钦定一对应 $1 \sim n$,答案乘上 $n!$ 即可。
刻画一下条件,我们把 $i$ 向 $[l_i,r_i] / {i}$ 连一条有向边,那么发现有解的充要就是这个图是 DAG。
每次加入一层零度点,那么其他点对应的区间不能跨过这些零度点,这样就划分出了相邻两个零度点之间的子问题。
然后就狂暴 dp,狂推式子。但还是看了题解。
怎么推式子?急急急急急急急急急急急急。
水羊羹 2
考虑最优解的形态,凹谷处一定是单个的数字,否则变为一个一定不劣。
于是我们记 $nxt_i$ 为 $i$ 下一个合法的区间。这样,我们假设大段的右端点在 $i$,$i$ 为为保留的小段位置,则这个区间就成为了选取的新的大段。
有结论 $nxt_i-i \le 2\log V$。
依旧感受一下。
对序列分块,记录每个点跳出块所需步数 $cnt_i$ 和跳出块后所在点 $to_i$ ,查询是简单的,分讨序列形态即可,于是就是 $n\sqrt n$。
CF1060G
很牛的题!神仙转换。
考虑一个极远的区间 $[\inf,\inf+n)$,它们每次会向前移动 $n$,于是在遇到 $a_n$ 之前,它们会不重不漏地覆盖 $a_n$ 右边的所有区间,然后发现,每次左端点到在 $a_{i-1} \sim a_{i}$ 之间时,这个区间被分成了两半,左边前进 $i-1$,与 $a_i$ 重复的被删了,右边前进 $i$,于是又是不重不漏!故结论可以强化成:一个极远的区间 $[\inf,\inf+n)$,向前移动可以不重不漏地覆盖 $a_1$ 右边的所有点。
有什么用?考虑求出某个点被覆盖的时间 $T$,与被哪个点覆盖到,于是我们只用求这个点经过 $T-k$ 次覆盖到哪个点即可。
具体地,可以先扫一遍求出每个点的 $T$,然后再对于每个点求出经过某个时间到达的点即可。
历史和
详见总结。
外郎糕
考虑转换成选一些数变成负数,然后要让前缀和非负,要求选最多数变成负的。
数据范围容易让人想到从值域入手。
考虑对于某个值 $x$,被选为负号的等于 $x$ 的位置一定是所有等于 $x$ 的位置里的一段后缀,否则改为同长度的后缀一定不劣。另外,考虑区间内最后一个没被选的 $x−1$,其位置一定小于第一个被选的 $x$,否则将这个 $x$ 换成那个 $x−1$ 一定不劣。
观察上面的性质,我们感性地猜测一个做法,从小到大枚举 $x$,对于 $A_i=x$ 的位置,贪心选能选的最长后缀。
对于每个 $x$ 和每个询问分别考虑二分一个最左边的位置即可,问题是 check 这么打?
假设二分到的区间 $< x$,后面的区间 $\le x$ 的数都是负数,那么这个位置合法的条件就是所有区间的前缀和非负,用 ST 表和前缀和判断即可。
CF1889D
听说 $\mathsf t \color{red} \mathsf{ourist}$ 都没有场切,珂怕。
看题解前:我没想不出。看题解后:我这都想不出?
考虑 $k=1$ 怎么做,是简单的,如何扩展?
发现,如果出现了一个环,那么便可以把环删掉,完全不影响答案,于是直接暴力找环,然后删边(弹栈)然后就做完了。
感觉思路很巧妙啊。
囚徒挑战
好题呢。
NOI Plus 模拟赛吗。
我是 zz 吗?怎么连最基本的拆位都没想到???
考虑拆位,每个囚犯只需要知道目前是第几位,上一个人看到的是 A 还是 B 即可。如果是二进制的话,一个 $5000$ 约小于 $2^{13}$,算上最后一位用来表示 AB,一共要 $26$ 次,取 $3$ 进制可以做到 $24$。
考虑优化这个算法,利用这个思想。
记录值域区间,$[L1,R1]$ 和 $[L2,R2]$,表示当前这个袋子的取值是 $[L1,R1]$,另一个取值是 $[L2,R2]$,然后计算答案。
$[L1,L2]$ 和 $[R2,R1]$ 是可以直接算的,接下来递归下去即可。
算一下这样是 $21$,怎么优化?发现底层拆两半更小,也就是前面全部拆成 $3$ 块,底层位 $2$ 块,于是就可以 $20$ 次了。
JZPKIL
好像是经典 trick,但我。。。
套路转化一下,变成:
$$
ny\sum_{d|n}dx\sum_{k|\frac{n}{d}}\mu(k)ky\sum_{i=1}{kd}}i^y
$$
然后呢?考虑后面那个 $ \displaystyle \sum_{i=1}{\frac{n}{kd}}iy$ 实际上是 $y+1$ 次多项式,令 $x^i$ 系数为 $a_i$,原式变成:
$$
ny\sum_{d|n}dx\sum_{k|\frac{n}{d}}\mu(k)ky\sum_{i=0}a_i(\frac{n}{kd})^i
$$
然后交换循环顺序,得到:
$$
n^y \sum_{i=0}^{y+1}a_i \sum_{d|n}\sum_{k|\frac{n}{d}}dx\mu(k)ky(\frac{n}{kd})^i
$$
后面一堆东西看起来挺熟悉的,令 $f(n)=n^x,g(n)=\mu(n) ny,h_i(n)=ni$,于是就有:
$$
n^y \sum_{i=0}^{y+1}a_i (fgh_i)(n)
$$
注意到 $f,h,g$ 都是积性函数,所以 $(fgh_i)(n)=Z_i(n)$ 也是积性函数。
原式变为:$n^y \sum_{i=0}^{y+1}a_i Z_i(n)$,对 $n$ 分解,只用关心 $Z_i(p^c)$ 和 $Z_i(1)$ 是什么就好了。
带入可得:
$$
\begin{aligned}
Z_i(1)&=1\
Z_i(p)&=pi+px-p^y\
Z_i(pc)&=\sum_{a=0}\sum_{b=0}{\min(c-a,1)}p (-1)^b p{by}p\
\end{aligned}
$$
直接算就好了。
最后问题就是求 $a_i$ 了,直接用伯努利数算。
Wooden Spoon
首先转换成在最左边,以此被击杀。
于是变成将它划分成 $1,1,2,\dots,2^{n-1}$ 段,将数字填进去,满足从右到左最小值递增,求方案数。最后乘上 $2^n \prod (2^i!)$。
考虑从右到左 DP,设 $f_{i,j}$ 为从右到左填到了第 $i$ 段,目前有 $j$ 个空位可以填的方案数。
从小往大填数,必须后面所有集合都非空时才能填这个集合。
于是转移就是:
$$
2^{n-i-1} f_{i,j} \rightarrow f_{i+1,j+2^{n-i-1}-1}\
jf_{i,j} \rightarrow f_{i,j-1}
$$
最后答案就是 $2^n f_{n,2n-k}(2n-k )!$,因为只有 $\le k$ 的数字的填充是有意义的,其他乱填即可。
Maximum Polygon
聪明题。
考虑固定了一个最大值怎么做。
直接令 $r_i$ 为下一个比 $a_{i}$ 大的 $a_{j}$ 的 $j$,然后从左往右能删就删。
考虑不固定怎么办,枚举啊!
发现如果上一次的最大值为 $x$,强制不选 $x$ 时 $> \frac{x}{2}$ 的数也会不选!否则一定可以通过选 $x$ 使得答案更优,于是可以删掉 $> \frac{x}{2}$ 的数。
于是直接就是 $n \log V$。
DNA Subsequences
挺有启发性的一题。
考虑直接有一个 $n^2$ 的 DP,就是 $f_{i,j}$ 表示分成 $i$ 段,直接做是 $n^3$ 的但是发现只有 $4$ 个点可以转移去。
然后发现 $f_{i}(x)$ 是凸的,于是可以 wqs 二分。
回忆下 wqs 二分本质就是二分斜率然后切这个凸包,然后发现 $f$ 的值域为 $n$,于是斜率只有 $O(\sqrt{n})$,于是就分治地做,将凸包上的 $\sqrt{n}$ 个点找到,输出是看看它在那个直线上就好了。
复杂度为 $O(\sqrt{n})$。
Best Friend, Worst Enemy
聪明题。
令 $d1_x$ 为 $(x,j)(0<j<i)$ 最大曼哈顿距离,$d2_x$ 为最小切比雪夫距离。
考虑一个点能被作为 $a$ 需要满足什么条件,注意到一个必要条件是 $2d2_i \ge d1_i$。
如果满足则暴力计算以 $i$ 为 $a$ 点的贡献,并把 $i$ 立为答案候选点。
现在更行答案候选点。
直接用 $i$ 来更新它们,并相应的更新 $d1,d2$。
如果更新完后仍然不可以作为答案候选点($2d2_i < d1_i$),那么就删掉,否则就输出答案。也就是所有以答案候选点为 $a$ 的贡献之和。
可以证明单次均摊是 $\log$ 的,以为这个条件相当于给平面分块,同一块中的点不能作为答案候选点。然后只有在曼哈顿距离翻倍时才会跑完。
众数
发现 $\sum k$ 很小,于是分块跑暴力。
发现瓶颈在于每块要从开始跑。
发现其实很多 $k$ 都很小,于是从后往前依次按 $20,21,22,23 \dots$ 分块,然后做完了。
记这个题的原因是记一下这种分块方法,有时候挺有用。
覆盖
很牛的题!
考虑 $1,2$ 两个点如果出点不一样(不算它们两个间的边,如果有的话)那么交换一下是一组新的解,于是答案在 $\bmod 2$ 下抵消了。
于是只用考虑出点一样。
考虑如果 $1,2$ 间有边,那么只能选一个,可以删掉一个。如果没边都可以选,可以合并。
于是可以把点合并下去。
具体的,现在有若干个点,点权分别为 $2{a_0},2,\dots$,此时可以选择两个点 $i,j$ 使得 $a_i=a_j$,然后删除 $i$,并让 $a_j$ 不变或加一。
最后肯定会剩下若干不同的 $a$。
于是设 $f_{i,S}$ 为 $i$ 个点,剩下的为 $S$ 的方案数。
然后有 $f_{i,S} \leftarrow (f_{i-1,S-1}+f_{i-1,S+\text{lowbit}(S)-1})\bmod 2$。
现在考虑最小点覆盖,先转成最大独立集,然后令 $g_{i,S}$ 为 $i$ 个点,最大独立集为 $S$ 的方案数。
可以经过若干讨论(考虑配对关系),得到:
$$
g_{i,S}\leftarrow f_{i,S}\
g_{i,S-\text{lowbit}(S)}\leftarrow f_{i,S}\
$$
第二个转移是因为如果不选最小的的话,其他选的点可以与它连或不连。
在 $\bmod 2$ 意义下加法都是异或。
最后用 bitset $n^2$ 做。
总结一下,$\bmod 2$ 时考虑配对关系。
Sum and Product
许久不见的推式子。
$k(a+b) \equiv ab \pmod n$,变成 $(a-k)(b-k) \equiv k^2 \pmod n$,等价于 $ab \equiv k^2 \pmod n$
考虑 $a$ 固定的情况。
考虑令 $d=\gcd(a,n)$,根据经典结论原式有解当且仅当 $g | k^2$,且时解恰好有 $d$ 个。
于是固定 $k$ 的答案为 $\sum_{d|\gcd(n,k^2)}\varphi(\frac{n}{d})d$。
再考虑若 $x=\prod p_i^{\alpha_i}$,令 $f(x)=\prod p_i^{\lceil\frac{\alpha_i}{2} \rceil}$
然后开始传统艺能:
$$
\begin{aligned}
\sum_{k=0}{m}\sum_{d|gcd(n,k2)}\varphi(\frac{n}
{d})d
&=\sum_{d|n}d\varphi(\frac{n}{d}) \sum_{k=0}{m}[d|k2]\
&=\sum_{d|n}d\varphi(\frac{n}{d})\sum_{k=0}^{m}[f(d)|k]\
&=\sum_{d|n}d\varphi(\frac{n}{d})\big( \lfloor\frac{m}{f(d)} \rfloor+1\big)\
\end{aligned}
$$
于是 $O(T \omega(n))$ 做完了。其中 $\omega(x)$ 是对 $x$ 分解质因数的复杂度。

浙公网安备 33010602011771号