8月做题记录

8月做题记录

✩ trick
✯ 会大部分,要\(tj\)提示
✬ 会小部分/完全没想到,看了\(tj\)才会
◈ 脑电波
✡ 有某一算法的神秘通用性质
⊗ 待补

PTZ summer 2020 Day1 I

显然每次取的都是\(<s\)的最大的元素,所以考虑用权值线段树维护

当前\(\geq s\)的最小元素为\(w_s\),那么在线段树上查询要取几次才能使得\(s>w_s\),这个可以\(log N\)的查询,然后发现当\(s>w_s\)时,\(s\)下一步取到的数一定\(\geq w_s\),也就是说如果把上面两个步骤和为一体,可以发现,\(s\)一定会翻倍,也就是说只有\(log W\)组这样的操作

复杂度\(O(Qlog Wlog N)\)

PTZ summer 2020 Day4 E

因为是不下降,所以最后一定形如\(1111222223333\)

那么考虑如果要枚举\(1\)的数量\(i\)\(3\)的数量\(j\),则可得到此情况下最优的长度为:

\[i+j+\min(suma_{sufa_j}-suma_{prea_i},sumb_{sufb_j}-sumb_{preb_i}) \]

其中\(suma_i\)表示\(a\)序列中前\(i\)个元素有几个\(2\)\(prea_i\)表示\(a\)中第\(i\)\(1\)的下标,\(sufa_i\)表示\(a\)中倒数第\(i\)\(3\)的下标,剩下的同理,且式子中的\(i\)\(j\)要满足\(prea_i<sufa_j\&\&preb_i<sufb_j\)

然后考虑固定\(i\),直接求出最优的\(j\)对应的答案,可以把括号拆开然后大分讨一下就可以维护了

复杂度\(O(N\log N)\)

CF1656H ✩✯

有一个显然的贪心做法,就是每次从\(S_A\)中删去元素\(x\)\(x\nmid lcm(S_B)\)),从\(S_B\)中删去元素\(y\)\(y\nmid lcm(S_A)\)),然后一直循环往,最后如果有一个集合删空了就不合法,否则最后剩下的\(S_A\)\(S_B\)就是答案

但是这道题数据范围很大,不支持直接算出\(lcm\),那么考虑转换一下判断方法:

\[\begin{aligned} &x\mid lcm(S_B)\\ &\Leftrightarrow gcd(x,lcm(S_B))=x\\ &\Leftrightarrow lcm_{y\in S_B}(gcd(x,y))=x\\ \end{aligned} \]

证明:

首先肯定最后的这个\(lcm\)值是\(x\)的因数,那么考虑这个值\(<x\)的情况

此时说明\(x\)存在某一因子\(p\),它的幂\(k\)是大于所有\(y\)\(p\)的幂次的,也就意味着\(x\nmid lcm(S_B)\)

那么就可以用线段树维护了,对于每个\(x\)建一棵线段树来维护这个值,每个\(y\)也要相对应的维护一个这种值

然后复杂度看似是\(O(N^2\log N\log W)\)的,实际是\(O(N^2(\log N+\log W))\)

考虑当删去一个\(y\)时,对一棵\(x\)的树的影响,\(gcd(x,y)\)的复杂度实际上是\(O(\log\frac{min(x,y)}{\gcd(x,y)})\)的,那么在树上修改一个地方后,也就是重新计算了一条从根到叶子的链的复杂度就为\(O(\sum_i\log\frac{min(x_i,y_i)}{\gcd(x_i,y_i)})\),这是等价于\(O(\log\prod_i\frac{min(x_i,y_i)}{\gcd(x_i,y_i)})\)的,发现\(\frac{min(x,y)}{\gcd(x,y)}\)相当于是\(lcm\)的变化值,那么所有\(lcm\)的变化值相乘就是\(lcm\)总的变化值,所以修改一次的复杂度就是\(O(\log n+\log W)\)

PTZ winter 2020 Day5 D

以前考试考过这道题?居然又遇到了

考虑枚举一个集合中最小的弧,则剩下的弧一定至少经过它的一个端点

将剩下的弧分为三类,第一类是和两个端点都有交,这种无论如何都合法,则直接选中,第二类是只与\(L\)有交,第三类是只与\(R\)有交

\(in_x\)i表示弧\(x\)与最小弧相交的长度,\(out_x\)为不相交的长度,有\(in_x+out_x=len_x\),设\(Len\)表示最小弧的长度

第二类中的弧\(x\)和第三类中的弧\(y\)有交当且仅当:\(in_x+in_y>Len\)\(out_x+out_y>1e6-Len\)

也就意味着如果把二类点用\((in_x,out_x)\)表示,三类点用\((Len-in_y,1e6-Len-out_y)\)表示,那么合法当且仅当不存在三类点处于二类点的非严格右上方

也就是说存在一条不升的分隔线,使得左下方全为三类点,右上方全为二类点,可以\(dp\)+数据结构维护

复杂度\(O(N^2\log N)\)

CF1270H

可以发现连通的一定是序列上连续的一段区间

那么有一种显而易见的做法就是直接用线段树去维护这些区间,具体的线段树上维护当前区间内的最小、最大值,以及区间内的连通块树以及将其左右两个子区间合并起来过后垮过中间的这个新的连通块是由左子区间的最后多少个和右子区间的开头多少个区间合并而成

复杂度\(O(Q\log N)\),这种做法实际维护的时候比较麻烦,但它可以扩展到更多的操作

对于这道题,有更简单的做法

\(pre_p\)表示\(min_{i\in[1,p]} a_i\)\(suf_p\)表示\(min_{i\in[p,n]}\),可以发现,连通块的数量等同于\(pre_{p-1}>suf_p\)\(p\)点的数量

那么现在问题转为统计\(pre_{p-1}>suf_p\)的数量,因为题目保证数值不重复,所以这个又等价于将\(>v\)的点染色为\(1\)\(\leq v\)的染色为\(0\),那么序列会被染色成\(111110000000\)(设\(a_0=INF,a_{n+1}=0\),那么就可以保证\(1\)\(0\)的数量都不会为\(0\))且\(v\)存在于当前序列中的\(v\)的数量,也就是求用\(v\)染色后,只会出现一次\(01\)交替的\(v\)的数量

那么对于相邻的两个值\(a_i\)\(a_{i+1}\),只需要将\([a_i,a_{i+1})\)间的值对应的权值给\(+1\),最后询问有多少权值为\(1\)且存在于序列中的\(v\)的数量

复杂度\(O(Q\log N)\)

PTZ winter 2021 Day9 A

树剖+\(dfn\)序乱搞题

根据\(dis(u,v)=depth_u+depth_v-2depth_{lca(u,v)}\),把三个\(depth\)拆开处理,可以发现\(depth_u\)\(depth_v\)都是好弄的,考虑如何处理\(depth_{lca(u,v)}\)

若记录\(cnt_u\)表示\(u\)子树内的所有点的\(a\)之和

那么对于点\(u\)向上跳时,若当前跳到了\(x\),上一步是\(las\),那么\(depth_x\)作为\(depth_{lca(u,v)}\)的系数是\(-2\times(cnt_x-cnt_las)\)

进一步的,若给某一个点\(x\)\(a\)值加上了\(1\),那么把从\(x\)到根的所有点的值\(Cnt_y\)都加上\(1\),然后一个点\(u\)向上跳时,直接对其跳到的所有点的\(Cnt\)求和,最后把这个值乘上\(-2\),那么与上文提到的\(-2\times(cnt_x-cnt_las)\)是等价的

那么对于操作\(1\),对于\(v\)在以\(1\)为根时\(u\)的子树内的操作是简单的,直接假设\(v\)不在\(u\)的子树内,那么就是直接操作\(u\)的子树,对于\(u\)到根的点,它们的\(Cnt\)都是加上\(u\)子树的大小,对于\(u\)子树内的点\(x\),则是加上\(x\)自身子树的大小,这就是一个一次函数

对于操作二,则\(u\rightarrow lca\)的路径上的点\(x\)\(Cnt\)是加上\(depth_u-depth_x+1\),这也是个一次函数,\(lca\)到根就是加上\(dis(u,v)+1\)

\(O(Q\log^2N)\)

ARC181A

首先就\(P_i\)本身就是\(1\sim n\)的话答案为\(0\)

答案为\(1\)当且仅当存在\(x\)满足\(P_x=x\),且\(max_{i\in[1,x-1]} P_i<x\)\(min_{i\in[x+1,n]} P_i>x\)

剩下的情况答案为\(2\)\(3\)

考虑什么情况答案为\(2\),先任选一个点操作后再选择\(1/n\)进行操作,这样最终不合法当且仅当\(P_1=n\)\(P_n=1\)

\(O(N)\)

ARC181B ◈✯

出题人和我共享一下脑电波好不好qwq

首先可以根据\(X\)\(Y\)\(0/1\)的数量列出\(k_1|S|=k_2|T|\)的式子

然后先判一下,如果\(k_1\neq0\&\&k_2=0\),不合法,否则当\(k_1=0||k_2=0\)直接合法

剩下的情况则可以解出\(|T|\),判一下是否是整数

那么去除经过\(X\)变化的字符串\(x\)和经过\(Y\)变化的字符串\(y\)开头相同的\(0/1\)后,会变成如下情况:\(S...=T...\),然后如果\(|S|=|T|\),直接让\(T=S\)即可,否则假设\(|S|<|T|\),那么\(T=S+T'\),然后替换一下后会变成\(S...=S+T'...\),然后像这样一直替换下去,发现当最后\(|S_{new}|=|T_{new}|\)时,其实就是一个辗转相除的过程,也就是说\(|S_{new}|=|T_{new}|=gcd(|S|,|T|)\),而且\(S\)\(T\)都是由一个长为\(gcd(|S|,|T|)\)的字符串重复组成的,然后判一下\(S\)是否满足即可

复杂度\(O(N)\)

ARC181C ◈✯

把出题人的脑子和我的脑子放在一起,可以共享脑电波吗

有种简单粗暴的想法,就是先把\(P_1\)行和\(Q_1\)列都全部赋值为\(0\),然后再考虑后面的内容

此时可以发现,因为第\(P_1\)行的值全都相同,那么在列与列的比较时,可以直接跳过第\(P_1\)个值的比较,也就意味着,\(P_1\)行相当于直接从矩阵中删去了,\(Q_1\)列同理也可删去

那么可以发现,现在就递归成了一个子问题了,但是如果依旧按照上述方式给\(P_2\)行和\(Q_2\)列赋值为\(0\),那么不会满足\(S_{P_1}<S_{P_2}\),因为\(S_{P_2}\)没有\(1\)

也就是说,我们需要在第一次赋值时保证会至少给以后的所有行都加上至少一个\(1\),还是不改变大体的框架,考虑什么列最适合赋值为\(1\),那就是\(Q_n\)列,先将\(P_1\)行全部赋值为\(0\),再将\(Q_n\)列空余部分全部赋值为\(1\),然后删去这一行和这一列,依旧按照这样的方法去解决子问题即可

复杂度\(O(N^2)\)

[CF1548E] Gregor and the Two Painters ✬✩

直接维护连通块啥的没前途,考虑用一个点来代表一个连通块

这里取一个连通块中以 (值,i,j)三维来排序后最小的那个点代表这个连通块,称这个点为代表点,这显然是一个一一对应的关系

那么现在问题就变成了数代表点的数量,代表点需要满足的条件就是不能到达任何一个 (值,i,j)比它小的点

\(prea_i\)表示最大的满足\(a_j\leq a_i\)\(j\)\(j<i\)),\(sufa_i\)表示最小的满足\(a_j<a_i\)\(j\)\(j>i\)),\(preb_i\)\(sufb_i\)同理

可以发现,一个\(a_{i'}+b_{j'}\leq a_i+b_j\)的话,\(a_{i'}\leq a_i\)\(b_{j'}\leq b_j\)h至少会满足一个,这也是我们只需要去找到最大的\(prea_i\)和最小的\(sufa_i\)即可的原因

可以发现\((i,j)\)不能走到\((prea_i,j)\)/\((sufa_i,j)\)/\((i,preb_j)\)/\((i,sufb_j)\)是该点是代表点的充要条件,进一步可以发现,这个走的过程,就只需要去看\((i,j)\)能否直接竖直/水平的走到这些点即可

\(ma_i=min(max_{k\in{[prea_i,i]}}a_k,max_{k\in{[i,sufa_i]}}a_k)\)\(mb_j=min(max_{k\in{[preb_j,j]}}b_k,max_{k\in{[j,sufb_j]}}b_k)\),那么一个点$(i,j)是代表点当且仅当:

\[\left\{ \begin{matrix} a_i+b_j\leq x\\ a_i+mb_j>x\\ ma_i+b_j>x \end{matrix} \right. \]

就是一个很普通的二维偏序问题了,扫描线+树状数组可以\(O(N\log N)\),我顺手写的\(CDQ\)分治,双\(\log\)

CF1209G2 ✯✩

对于值\(i\),设其最左端在\(L_i\),最右端在\(R_i\),将\([L_i,R_i)\)的所有点的\(c_x\)\(1\)

那么最后答案就是所有极长非零区间的答案之和,显然每个这样的区间独立,而一个区间内的答案就是 这个区间内的点的总数-区间内出现次数最多的同种颜色点的数量

然后把颜色\(i\)的数量挂到\(L_i\)上即可

然后肯定需要线段树去维护,但是可以发现,如果就用\(c_x=0\)作为分界点的话,对于那些区间加减\(1\)的操作是无法维护的,这也许算是一个\(trick\)?对于当前区间,我们就以当前区间内的最小值作为分界点,然后就可以维护了

Gym103469I/petrozavodsk summer 2021 Day 3 I ✯✩

肯定要容斥,用\(C_N^3\)减去存在有交的方案数就是答案

考虑计算有交的方案数,可以分为三种情况,只有两个间有交且与第三个无交,一个矩阵和另外两个矩阵有交且这两个矩阵间无交,三个矩阵两两有交,分别记它们的方案数为\(c_1\)\(c_2\)\(c_3\),那么答案即求\(c_1+c_2+c_3\)

然后一般的题会分别求出\(c_1\)\(c_2\)\(c_3\)然后把它们加起来,但是这道题不是这样

\(d_i\)表示所有矩阵中与矩阵\(i\)有交的矩阵数量,那么有:\(\sum d_i(n-2)=2c_1+4c_2+6c_3\)\(\sum C_{d_i}^2=c_2+3c_3\),两式相消后可得\(c_1+c_2\)

\(d_i\)可以扫描线随便求

现在就只需要求出\(c_3\)即可

可以发现,当三个矩阵两两有交时,它们的交集一定不为空,进一步可以发现,它们的交集中一定存在一个点\((x,y)\)\(x\)是这三个矩阵中最小的\(r_i\)\(y\)是这三个矩阵中最小的\(u_i\)

这启发我们先去固定这个最小的\(u_i\),即先确定一个矩阵,满足这个矩阵的\(u_i\)是三个中最小的那个,然后考虑找另外两个矩阵\(j\)\(k\),首先它们两个肯定要满足\(d_j\leq u_i\leq u_j\)\(d_k\leq u_i\leq u_k\),然后再来考虑横坐标,可以发现,要满足交集不为空,只需要满足两两间交集不为空即可,首先也要满足\([l_j,r_j]\)\([l_i,r_i]\)有交、\([l_k,r_k]\)\([l_i,r_i]\)有交,然后还要满足\([l_j,r_j]\)\([l_k,r_k]\)有交,两个不确定的矩阵有交不好处理,但是求无交就好处理了,因为无交时只需要满足其中某一个矩阵的右端点在另一个的左端点的左侧,所以这里也容斥一下,又因为\([l_j,r_j]\)/\([l_k,r_k]\)\([l_i,r_i]\)是有交的,则\([l_j,r_j]\)\([l_k,r_k]\)间无交的情况一定满足其中一个的右端点\([l_i,r_i]\)内,另一个的左端点在\([l_i,r_i]\)内且右端点在左端点左边,所以只需要求出\([l_i,r_i]\)内有多少对左右端点满足右端点在左端点左边,依旧是扫描线插入删除\(j\)\(k\)

复杂度\(O(N\log N)\)

XX opencup GP of Poland E

如果能确定每条边是什么时候被删除的,那么就可以直接上\(kruskal\)重构树\(O(Q\log(N+M))\)的做了

考虑怎么确定每天边是什么时候被删除的,每修改一个点,都会对应去维护其连接的所有边,那么我们肯定想要用\(set\)啥的去统一维护这些边,但是一条边有两个点,肯定做不到让两个点都来维护这条边,也就是说必须给边定向,让这条边指向的那个点来统一维护它们,这时修改一个点时,可以数据结构\(log\)的维护指向它的边,对于从它指出去的边,则要暴力维护,假设最大的出度为\(d\),那么这部分的复杂度为\(O(k\log N+kd\log N)\)

对于一般图的情况,每次取度数最小的点,把与它相连的所有边变成出边,然后删去这个点与这些边,这里的\(d\)\(O(\sqrt M)\)的范围,也能过,但是注意图是平面图,对于一个\(n\)个点的极大平面图,\(m=3n-2\),那么最小的\(d\)始终满足\(\leq5\),所以复杂度实际上十分小

这是平面图的五色定理,扔个链接在这,什么时候感兴趣了再看证明(

总复杂度\(O(k\log N+Q\log(N+M))\)

「THUPC 2024」古明地枣的袜子 ✯✩

发现有两个维度,位置时间,而询问又是关于 时间的,所以我们直接对操作以\(x\)排序,去除 位置这一考虑的因素,现在就只需要处理时间了

将操作排序后每\(B\)个分为一个块,则有\(O(\frac nB)\)块,然后考虑计算每一块对每个询问的贡献

首先,后面的所有块中的操作的位置都是\(\geq\)这个块中的操作的位置,也即只需要知道后面的块中 时间处于询问范围内的所有操作的\(y\)之和,然后当前块中的所有点的值一定是会加上这个和的

再来考虑当前块中的答案,因为只包含\(B\)个操作,也就是只有\(B\)种时间,那么每种询问就会对应到当前块中时间第\(k_l\)小的操作到时间第\(k_r\)小的操作,可以发现,一共只会有\(O(B^2)\)种,那么我们可以预处理\(f[i][j]\)表示只考虑当前块中时间第\(i\)小到时间第\(j\)小的这\(j-i+1\)个操作的答案,最后把这个答案加上上一段中求出的\(y\)的和即可

然后普通的一些做法最后会带\(log\),考虑怎么不带\(log\)

发现我们的操作序列已经对位置进行排序了,而只有位置大的会对位置小的产生贡献,发现很分治,那么分治的复杂度就是\(T(N)=T(\frac N2)+O(N^2)\),由主定理可得\(T(N)=O(N^2)\),即一次的复杂度为\(O(B^2)\)

那么只需要\(B\)取到\(\sqrt N\),就可以做到\(O((N+M)\sqrt N)\)的复杂度了

ARC181D ◈✯

牛魔出题人的脑电波,根本对不上

一开始想出了一个维护上升队列的做法,然后发现不可做,不是你往\(D\)题塞这种\(nt\)题真的合理吗 (♯▼皿▼)

模拟这个过程,设当前点\(i\)左侧有\(l_i\)个值大于它的点,可以发现,没进行一轮这样的操作,那么所有的不为\(0\)\(l_i\)都会减小\(1\),这个\(\Delta\)就是逆序对的变化值,然后因为\(A\)是不降的,所以每次相当于会加入几个新的数进来

所以只需要求出初始的\(l_i\),然后中途的过程用线段树去模拟一下即可,具体就是线段树记录区间非\(0\)\(l_i\)\(min\)值,然后就打\(tag\)啥的随便做

复杂度\(O(N\log N)\)

不是怎么能这么简单,我还说\(D\)题不可能很简单吧,就没想啥简单的做法,无语

ARC181E ✩✬

很牛的题!

称满足题目要求的生成树为好的,首先考虑将边\((u,v)\)赋值为\(|u-v|\),可以发现,好的生成树一定是该情况下的一棵最小生成树

考虑反证,若不是最小生成树,则说明存在一条非树边,它的权值比它连接的两点在树上的路径上的最大边权小,可以发现,这种情况下,该非树边要求的\(u\)最小\(v\)最大一定不能满足

那么这启发我们去找给边赋值的方法使得求出的最小生成树能够满足其就是好的生成树的办法

  • 给边\((u,v)\)赋值为\((n+1)*v-u\),最小生成树能保证\(v\)\(u\rightarrow v\)上最大的点,且此时最小生成树唯一
  • 给边\((u,v)\)赋值为\(v-(n+1)*u\),最小生成树能保证\(u\)\(u\rightarrow v\)上最小的点,且此时最小生成树唯一

因为两者都保证了最小生成树唯一且它们分别满足一种限制,所以合并起来,也就是满足这两种方式下生成的最小生成树相同,那么就存在好的生成树,否则不存在

那么可以考虑先求出全局的两种最小生成树,那么每次询问时删除的边,如果不在最小生成树中,那么对最小生成树没有影响,否则找到一条权值最小,且刚好连接了断掉这条边后的两个连通块的边,这条新边就是替代原来的边的边(可以用\(kruskal\)算法的过程来证明这样是合法的)

那么具体实现就可以遍历不在最小生成树中的边\((u,v)\),然后去给\(u\rightarrow v\)的树上路径上的边更新,只需要给每条树上的边都维护出能更新它的非树边中权值最小的即可,这个可以重链剖分来维护

最后查询的时候可以用\(hash\)/\(bitset\)啥的来\(check\)是否相同

复杂度\(O(M\log^2 N)\)

qoj8008

呆呆题,但我更呆(´;ω;`)

可以发现,如果我们当前选择了走\(k_i\)步,那么之后都不会再随机走了,因为走了\(k_i\)步后在随机走肯定不如直接随机走

也就是说,最优方案一定是先随机走,最后再走\(k_i\)

考虑先求出每个点到\(0\)只走\(k_i\)步的最短距离\(dis\),然后根据\(dis\)从小到大排序,再枚举一个临界值,满足\(dis\leq\)这个临界值的都是直接走\(k_i\)步,\(dis>\)这个临界值的则是先随机到\(dis\leq\)临界值的点,然后再走\(k_i\)

复杂度\(O(NK)\)

CF741C ✯✩

我不会构造题/ng

比较一眼的是感觉肯定要\(2-sat\)或二分图染色啥的,考虑二分图染色

对于一对情侣的限制是好处理的,只需要在两点间连边即可

对于相邻三个不能同色的限制,即要求相邻三个中有两种颜色,考虑直接给它加上更严苛的限制,要求\(2i\)\(2i-1\)两点不同色,此时有连边\((2i,2i-1)\),可以发现,这样连边后刚好形成一个二分图,只需要去证明不存在奇环即可

复杂度\(O(N)\)

这种就是考虑加强某一限制,然后去证明加强前后无解的情况不变就行

CF1656G

先不考虑循环数列的限制,求出一组\({b_i}\),这个是好求的,直接从两端往中间确定\(b_i\)即可

如果连边\(i\rightarrow b_i\),那么循环数列就是只有一个环,普通的排列就是存在多个环,那么现在只需要考虑把这多个环合并在一起即可

合并环\(A\)\(B\),若存在\(x\in A\)\(y\in B\),且\(b_x=b_y\),那么直接交换\(b_x\)\(b_y\)即可把两个环合并

若不存在,则任意取出\(x\in A\)\(y\in B\),要求\(x\neq n-x+1\)\(y\neq n-y+1\),那么令\(b'_x=b_y\)\(b'_{n-x+1}=b_{n-y+1}\)\(b'_y=b_{n-x+1}\)\(b'_{n-y+1}=b_x\)即可

对于\(n\)是偶数,显然通过上述构造一定有解,对于\(n\)是奇数,无解当且仅当\(a_{\lfloor\frac n2\rfloor}\)\(a\)中只有一个

复杂度\(O(N\log N)\)

调整法

CF1844E ✬✩

对于一个\(2\times2\)的矩阵,大概可以分为两类:左上角和右下角相等右上角与左下角相等

\(0/1/2\)替代\(A/B/C\),用\(c_{x,y}\)表示格子\((x,y)\)上的数

设矩阵为\(\left[\begin{matrix}a\ b\\c\ d \end{matrix}\right]\),可以发现,对于任意一种合法的情况,都有\(a+d\equiv b+c\mod3\),这个很好证明,从\(a+b+c+d\)入手去证明即可

那么变换一下有,\(a-d\equiv c-d\mod3\),这代表对于同一个\(x\)任意一个\(y\),有它们的\(c_{x,y+1}-c_{x,y}\)是同余的,\(a-c\equiv c-d\mod3\),这代表对于同一个\(y\)任意一个\(x\),它们的\(c_{x+1,y}-c_{x,y}\)是同余的

这两个条件对矩阵合法来说是充分必要的,设\(a_x\)表示\(c_{x,y+1}-c_{x,y}\)\(b_y\)表示\(c_{x+1,y}-c_{x,y}\),那么现在再来找\(a\)\(b\)间的关系

然后以为相邻的格子不能相同,所以\(a\)\(b\)的值均为\(1/2\)

对于限制条件,设\(x=\min(x_1,x_2)\)\(y=\min(y_1,y_2)\),若其是 左上角和右下角相等类,那么有\(a_x\neq b_y\),若是 右上角与左下角相等类,有\(a_x=b_y\)

用类似二分图染色的方式判断即可

复杂度\(O(N+M+K)\)

矩阵的构造题应该有很多都会是这种找列与列/行与行的关系啥的,然后染色\(check\)

2022 ICPC Nanjing C Fabulous Fungus Frenzy/Gym104128C

坏了,看构造题啥都是\(trick\)

如果从起始到终止局面的模拟这个过程,可以发现每一步都非常的“不确定”,即你不能确定当前走与不走这一步有什么区别

考虑从终止到起始局面,此时,覆盖操作就变成了对于左上角一个\(n_i\times m_i\)的矩阵,满足这个矩阵和覆盖操作对应的矩阵相同,然后此时就可以把这个矩阵内的所有元素给替换成任意一个元素

因为题目只要求求出合法的方案即可,所以就可以贪心乱搞的做了

这个就是把从起始到终止的操作给倒过来考虑,从终止到起始

Ptz Winter 2020 Day6D Split in Sets

首先,肯定能感受到把每个大的数单独放在一个盒子里肯定是比较优的方案

那么来考虑当前所有数中的最高为\(2^d\)

若拥有这一位的数不超过\(k-1\)个,此时一定是拥有\(2^d\)的每个数单独放到一个盒子中严格最优,证明考虑拿出\(x_1,x_2<2^d\leq y\),如果把\(x_1\)\(y\)放在一起,\(x_2\)单独放,产生的贡献为\(x_1+y-(x_1|y)+x_2\),但是如果\(x_1\)\(x_2\)放在一起,\(y\)单独放,产生的贡献为\(x_1+x_2-(x_1|x_2)+y\),显然\((x_1|x_2)<(x_1|y)\),除去这种情况外,更不可能把\(2^d\leq y_1,y_2\)\(y_1\)\(y_2\)放在一起,证明类似

若拥有这一位的数至少有\(k\)个,则此时那些\(<2^d\)的数i一定会被放在一起,考虑反证,如果不放在一起,那么原本有\(k-1\)个位能贡献\(2^d\),现在就至多只有\(k-2\)个位能贡献\(2^d\)了,肯定是不优的,此时就直接把\(<2^d\)的数合并,然后因为有\(k-1\)个位都能贡献\(2^d\),所以可以直接删去\(d\)这一位,然后递归子问题即可,然后特判一下全都有\(2^d\)的情况

复杂度\(O(N(\log V+\log N))\)\(O(N\log N)\)是最后一层算答案时用的

1st ucup stage 3 F Flower Garden/QOJ5504 ✬✩

二选一,很显然的\(2-sat\),但是这里的连边有两种,\(2-sat\)无法做到维护两种边,但是可以发现,这两种边是刚好完全反向的,且\(0/1\)的数量限制相同

考虑只保留一种边,这里保留若\(u\)\(1\)\(v\)一定为\(1\)的边,那么其实还存在若\(v\)\(0\)\(u\)一定为\(0\)的边,但我们将它隐藏,这个可以线段树优化建边

然后\(tarjan\)缩点后成了一个\(DAG\),然后给每个\(scc\)赋值为其所包含的点数

若存在一个\(scc\)的值\(\geq n\),那么把它放到哪个集合中,哪个集合就满足至少\(n\)个的限制了,考虑枚举将它放到哪个集合中,例如放到\(1\)集合中,则它能到达的所有\(scc\)都要被放入\(1\)集合中,此时最优的情况就是把剩下所有\(scc\)放到\(0\)集合中,若此时\(0\)集合的值\(<n\),那么一定有把这个\(\geq n\)\(scc\)放到\(0\)集合中能满足条件,所以这里\(check\)一下是这个\(scc\)能走到的点的值之和更大还是能走到这个\(scc\)的更大即可,然后把\(scc\)和那个更小的放到一起即可,因为总共有\(3n\)个点,所以一定存在解

否则所有\(scc\)的值都\(<n\),那么按\(top\)序排序后,直接取一个前缀使得前缀和满足\([n,2n]\),因为最大值\(<n\),所以一定存在这样的前缀

\(N\)\(M\)同阶,复杂度\(O(N\log N)\)

这里因为两种限制都是想对称的,所以可以只保留其中一种,易证这样做两种限制都能满足

ARC181F ✬◈✩

考虑将序列转移到树上,具体的,维护点\(pos\)表示当前在树上的哪个点,初始的\(pos\)代表\(a_1\),加入\(a_i\)

  • \(a_i=a_{i-1}\),则\(pos\)不动
  • 若与\(pos\)相邻的点中存在代表\(a_i\)的点,则将\(pos\)移动到这个点上去
  • 否则新建一个点\(pos'\)\(pos'\)挂在\(pos\)上且\(pos'\)代表\(a_i\)

那么现在就得到了一棵树,设起始的\(pos\)\(st\),终止的\(pos\)\(ed\),则可以发现,最终不能再操作时的序列可以被分成许多颜色块,而颜色的顺序以及数量就和树上从\(st\)\(ed\)的简单路径经过的点代表的颜色相同

这棵树还有一个重要的性质,若\(a_i\)时处于点\(p_i\),且最终序列中\(a_i\)处于点\(p'_i\),那么\(a_i\)会被操作\(dis(p_i,p'_i)\)次,那么最终的答案其实就是\(\sum dis(p_i,p'_i)\)

知道了最终\(p'_i\)的组成以及答案的运算方式,就可以来考虑如何计算答案了

因为\(p'_i\)都是在\(st\)\(ed\)的链上,所以可以先把所有的\(p_i\)都挂到距离\(p_i\)最近的那个链上的点上,也即挂到它所属的那个子树的根上去,设挂上去后为\(q_i\),那么先给答案加上\(\sum dis(q_i,p_i)\),因为\(p_i\)要到任意一个链上的点都要先经过\(q_i\),所以这样合法

那么现在就得到了一个链的序列\(q_i\),为了方便\(dis\)的计算,处理出链上每个点\(x\)\(st\)的距离\(d_x\),对于要求的最终序列\(p'_i\)就会需要满足\(p'_1=st\)\(p'_n=ed\)\(d_{p'_i}-d_{p'_{i-1}}\in[0,1]\),当\(d_{p'_i}=d_{p'_{i-1}}+1\)时,一定有\(p'_i=q_i\)\(p'_{i-1}=q_{i-1}\)

来考虑\(dp\)转移,设\(dp_i\)表示当\(p'_i=q_i\)时,前\(i\)个的最小答案,\(pre_x\)表示在\(\{q_i\}\)中,\(x\)上一次出现的位置

\[dp[i]= \left\{ \begin{matrix} \begin{aligned} &dp[i-1] &&d_{q_i}=d_{q_{i-1}}+1\\ &dp[pre_{q_i}]+\sum_{j=pre_{q_i}+1}^{i-1} |d_{q_j}-d_{q_i}| &&pre_{q_i}\neq-1 \end{aligned} \end{matrix} \right. \]

因为\(pre_{q_i}\)是上一次出现的位置,所以一定有所有的\(d_{q_j}\)都大于\(d_{q_i}\)或都小于,于是前缀和即可

复杂度\(O(N)\)\(O(N\log N)\)

CF1646F

感觉可以直接乱搞,就直接把不第\(i\)行不等于\(i\)的往下传,然后传到对应的位置就固定,这种做法感觉挺对,没证,放这当个乐子

官方做法是先把每个玩家手中的牌都变成\(1\)\(N\)的排列,然后再操作成目标序列,这一步的最小代价是\(\frac{N(N-1)}2\)的,只需要让第\(i\)行变成\(i\sim N,1\sim i-1\)的形式,然后每一列都一直转就行了

那么考虑证明从任意状态变成每个玩家手中都是一个排列的最小操作数也是\(\frac{N(N-1)}2\)即可

考虑这样一个策略:若当前行不是排列,则一定有把一个重复的牌丢下去更优,而如果已经是一个排列了,那么它丢出和进来的牌一样的牌即可,这个策略显然是最优的

然后可以发现,每这样操作一轮,就会至少有两个人的牌的数量增加了\(1\),所以操作数就是\(O(\frac{N(N-1)}2)\)

OpenJ_POJ C23C Empty up a Bottle

若操作\((A,B)\)\(A<B\)),操作一次后就变成了\((2A,B-A)\),发现这等价于\((2A\%(A+B),2B\%(A+B))\),也就是说,我们操作\(k\)次后变成\((2^kA\%(A+B),2^kB\%(A+B))\)

可以发现,若此时\(A+B\)为奇数,那么会有\(2^\varphi(A+B)\equiv 1\mod A+B\),也就是说,能实现让\(A\)\(B\)\(2^k\)也能实现让它们除\(2^k\)

那么假设原本的\((A,B,C)\)中,\(A\)\(B\)是偶数且\(A<B\)\(C\)是奇数,那么对\((A,B)\)操作一次,得到\((2A,B-A,C)\),然后再对\((2A,C)\)操作一次得到\((A,B-A,C+A)\),若\(B\)\(A\)很多第一步可以操作很多次直到不能再操作,发现此时\(A\)\(B\)还是偶数,\(C\)还是奇数,那么可以继续重复上述的操作,这是一个类似辗转相除的过程,复杂度是\(\log(A+B)\)

考虑扩展这个情况,当三个数均为偶数时,可以一直给它们除\(2\),三个数均为奇数时,现将任意两个操作一下,就变成了两个偶数一个奇数,当两个奇数一个偶数时,两个奇数操作一下就变成了三个偶数的情况

qoj895/Ptz Winter 2021 Day4I Color ✬✡

首先可以前判掉一些初始就不合法的情况,初始图的边不合法或\(m+1\)为奇数

因为一共有\(\frac{(m+1)m}2\)条边,有\(m\)种颜色的边,那么一种边有\(\frac{m+1}2\)条,当\(m+1\)为奇数时显然不合法

然后对于每种颜色的边,可以维护一个大小为\(\frac{m+1}2\)的集合,其中有三种\(set\)\(0-set\)\(1-set\)\(2-set\),是根据\(set\)内的大小划分的,设这三种\(set\)的数量为\(c_0\)\(c_1\)\(c_2\)

那么有\(c_0+c_1+c_2=\frac{m+1}2\),而我们能确定的是\(c_1\)\(c_2\),所以只要\(c_1+c_2\leq\frac{m+1}2\)恒成立即可

然后考虑每加入一个新点,设它是点\(i\),都会选择\(i-1\)个不重复的颜色和\(i-1\)个不重复的点且要求点和颜色一一对应,即点在对应颜色的\(1-set\)

那么就很网络流了,考虑网络流一下

左边\(m\)个点代表颜色,\(S\)向左边的点都连流为\(1\)的边,右边\(i-1\)个点代表已经加入的点,这些点向\(T\)连流量为\(1\)的边,然后根据点\(x\)\(x\leq i-1\))没有哪些颜色的边,就从那些颜色向点\(x\)连流为\(1\)的边,然后右边还有第\(i\)个点,它向\(T\)连流为\(m+1-i\)的边,代表点\(i\)最终会没有哪些边,然后所有颜色向这个点连两倍\(c_0\)的流为\(1\)的边

那么可以发现,左侧所有点的出度(\(2c_0+c_1\),等价于还需要加入的点数),和右边前\(i-1\)个点的入度均为\(m+2-i\),而右边第\(i\)个点只需要拆成\(m\)个点就可以得到一个正则二分图,所以一定存在完美匹配

正则二部图完美匹配的证明

UOJ354 新年的投票 ✬◈

\(sub\ 1\)纯唐,若每个点都直接投按照它看到的的\(n-1\)个数的异或和,发现只有\(0\)的数量为\(7\)\(1\)的数量为\(8\)时会出问题,这个的情况数为\(6435\),小于\(7000\)

先来考虑\(x\)最随意且每个人能看到的最多的\(sub\ 3\)

若让第\(i\)个人投\(2^i\)票,且当\(1\sim i-1\)都没有\(1\)时,视\(i\)\(1\),然后算出全局的异或和并给这个异或和投票\(2^i\),若\(1\sim i-1\)存在\(1\),则不投票

可以发现,这样能够投票的人是一个前缀,且最后一个能投票的人是第一个\(i\)\(1\)的,且它的权重比前面所有人的权重加起来都大,也就是说最终答案一定会取到这个人投的值

那么会出现问题当且仅当是全\(0\)的,也就是只有一种

再来考虑\(sub\ 2\)

\(sub\ 3\)的二进制数量票数启发,考虑将\(n\)个点划分成四组,大小分别为\(1\)\(2\)\(4\)\(8\),然后每个组内的都合并为一个,依旧用\(sub\ 3\)的做法,那么不合法当且仅当每一组都是\(0\),情况数为\(C_1^0\times(C_2^0+C_2^2)\times(C_4^0+C_4^2+C_4^4)\times(C_8^0+C_8^2+C_8^4+C_8^6+C_8^8)=2048\)小于\(2100\)

最后考虑\(sub\ 4\)

它和\(sub\ 2/3\)就没有共通之处了

我们让奇数对应正数,偶数对应负数

考虑如果我们能确定得到一个不超过\(k\)阶多项式,其中某一项形如\(k'x_1x_2x_4\)\(k'\)为系数,\(x_i\)表示\(01\)串中第\(i\)位是\(0\)还是\(1\)),且这个多项式能在题目要求的范围内较准确的确定答案,那么我们就可以求出答案了,因为是不超过\(k\)阶的,所以每一项都可以由某一个人来确定,所以我们只需要把每一项都挂给某一个可以确定它的人即可

\(s=\sum x_i\),考虑找到一个\(k\)阶多项式\(g(s)=\prod_{i=1}^k(s-p_i)\)满足若\(s\)为偶数,则\(g(s)<0\),否则\(g(s)>0\),那么得到\(g(s)\)后再把\(s=\sum x_i\)代进去就能得到我们想要的那个\(k\)阶多项式了

因为\(s\in[0,12]\),且因为\(g(s)\)\(k\)阶的,就有\(k\)个零点,那么就注定有些\(s\)对应的\(g(s)\)无法满足要求,然后我们发现,当无法满足要求的\(s\)\(0\)\(2\)\(11\)时,会出现错误的情况数为\(C_{12}^0+C_{12}^2+C_{12}^{11}=79\),刚好满足\(<80\)的条件,那么对应的,令\(p_i=2.5+i\)即可满足这个要求

将式子化简后并乘上\(-128\)可得\(-128s^7+5824s^6-111776s^5+1172080s^4-7246232s^3+26389636s^2-52371534s+43648605\)

然后再把\(s=\sum x_i\)代入就能得到关于\(x_i\)\(k\)阶多项式了,然后没一项分配一下即可

[IOI2023 集训队互测 R8T2] 妙妙题 ✬◈

大概考虑一下如果只看黑白的数量来确定当前点选什么,做不到

也就是说,必须要考虑 位置这一因素,再想到题目说的是\(\lfloor\frac {N-1}2\rfloor\),所以可以考虑把\(n\)个点放到单位圆上去,然后沿着某一过圆心的直线把圆切成两半,让其中一半知道所有的\(1\)的个数为奇数个,另一半知道为偶数个,那么这样总有一半知道的是正确的,而这个直线又最多切到\(2-(n\mod2)\)个点,所以刚好能有\(\lfloor\frac{N-1}2\rfloor\)个是正确的

然后如果在编号确定的情况下,可以选择直接把这条直线设置成\(x=0\),然后让左边的认为是奇数,右边的认为是偶数,线上的随便都行

但是因为又要求了看到的相同的话则输出也要相同,且困难模式的编号是不确定的,所以考虑换种能在不知道编号的情况下确定这条线的方案

先考虑若已知所有的点的颜色,那么把所有\(1\)点的向量\(v\)加起来得到向量\(v'\),然后在\(v'\)左侧的认为是奇数,\(v'\)右侧的认为是偶数,这样有个好处,若当前询问的点本身就是\(0\),那么直接把它知道的所有\(1\)点的向量加起来就能得到\(v'\)了,且无论如果旋转(若当前询问的是\(x\),那么我们就直接令\(x\)\((1,0)\)上),因为是所有点整体旋转的,所以这个点在\(v'\)的左还是右是不变的,而如果现在就是\(1\)点,如果把它默认成\(0\)点的话,求出的\(v'\)就是原本的\(v'\)减去这个\(1\)点的向量,可以发现,当原本的\(v'\)不与\(1\)点共线的话,新的\(v'\)也不会和\(1\)点共线,且\(1\)点相对于新旧\(v'\)都在同一侧,若原本共线的话,现在也共线/或者新的\(v'=0\)

上文我们没有管\(v'\)与当前点共线或\(v'=0\)的情况,实际上若\(v'\)与当前点贡献,则令当前点为\(1\),若\(v'=0\),则令当前点为\(0\)

总结一下就是,假设当前点就是\(0\)点,算出其知道的那些\(1\)点的向量和\(v'\),如果\(v'=0\),那么当前点为\(0\)点,若\(v'\)与当前点共线,则当前点为\(1\)点,否则若当前点在\(v'\)左侧,则可知共有奇数个\(1\)点,在右侧可知有偶数个\(1\)

那么对于原本\(v'\)就为\(0\)的情况,所有点都一定能判断正确;对于原本的\(v'\)不为\(0\)的情况,则可知只有\(2-(n\mod2)\)个点在线上,而其余的点中有一半是正确的,也就是有\(\lfloor\frac{N-1}2\rfloor\)个是正确的

OpenJ_POJ C24D Number Solidity

\(a\)\(b\)肯定都是质因数且\(b\)\(x\)的最小质因数,且\(a\)\(x\)的最大质因数开始操作一直到最小质因数,这样就能保证\(b\)一直能取到最小的那个质因数

那么现在考虑算\(a\)的贡献,考虑枚举\(b\),那么贡献就形如 不被小于b的数整除且要被b整除且要被a^b整除+不被小于b的数整除且要被b整除且要被(a^b)^2整除+不被小于b的数整除且要被b整除且要被(a^b)^3整除+...

可以去枚举\((a^b)^k\)\(k\),然后要满足 要被b整除且要被(a^b)^k整除就是\(lcm(b,(a^b)^k)\)的倍数,然后不被小于\(b\)的数整除也就是不被小于\(b\)的质因数整除,这个可以容斥,就枚举可以被集合\(s\)内的因子整除,然后就得是这一堆数的\(lcm\)的倍数,大概是这样

然后看起来复杂度比较爆炸,但是因为实际上各层枚举的上限都很小,所以跑得挺快的

CF2002C

考虑对于一个圆心\((x_i,y_i)\),若\(dis(i,T)\leq dis(S,T)\),则无论怎样走,最后走到\(T\)时都一定会和这个圆撞上

然后可以发现,如果所有圆都满足\(dis(i,T)>dis(S,T)\),一定可以直接让\(S\)沿直线走到\(T\)且不会碰到圆,这个可以分类一下圆心向\(S\)\(T\)的连线连垂线后,在两点间还是在\(S\)那一侧/\(T\)那一侧,两侧是容易证明的,对于在中间的,设\(S\)\(T\)走了距离\(d\),然后圆心向这个点(\(S\)走了\(d\))连线,长度为\(l\),只需要证明\(d<l\)恒成立即可,然后就可以大分讨一下,用点正弦定理啥的即可的证

CF2002D1/CF2002D2

\(D1\)版可以根据深度是\(O(\log N)\)的随便乱做

\(D2\)版的,考虑一个合法的\(DFS\)的充分必要条件,这里有两种:

  • 第一种

设点\(x\)\(DFS\)序列的第\(pos_x\)位上,对于点\(u\)和它的儿子\(v\),若合法会有\([pos,pos_v+sz_v-1]\in[pos_u,pos_u+sz_u-1]\),只要所有的\(u\)都满足条件,这个\(DFS\)序列一定就是合法的

可以用集合来维护,复杂度\(O((N+Q)\log N)\)

这种其实就是平常用的\([dfn_v,dfn_v+sz_v-1]\in[dfn_u,dfn_u+sz_u-1]\)的变形,比较常见,第二种方法不太常见,至少这是我第一次见

  • 第二种 ✡

考虑合法的\(DFS\)序列\(\{p_i\}\)一定有\(fa[p_{i+1}]\)\(p_i\)的祖先,这显然是充分的,考虑证明其必要性,考虑反证,如果不是必要的,说明存在一个不合法的\(DFS\)序列也满足这个条件,找到这个\(DFS\)序中第一个不在它应在的位置上的点\(p_i\),则要么有\(fa[p_i]\)不是\(p_{i-1}\)的祖先,要么找到后面的第一个\(j\)满足\(p_j\)\(p_{i-1}\)的子树中,那么一定有\(fa_{p_j}\)不是\(p_{j-1}\)的祖先

这种做法可以用\(dfn\)\(O(1)\)判是否是祖先,复杂度\(O(N+Q)\)

CF2002E

考虑当一个点删空后,会导致它两侧的点相邻,若颜色相同会合并,且我们可以发现,一个点最多只会向左合并一次,那么合并就是\(O(N)\)

如果给每个点打一个\(tag\),表示这个点是否向左合并了,如果\(tag=0\),说明没有合并,在\(tag=0\)的点维护一个\(time\)表示这个点代表的这些点被删空的时长

发现一个点\(x\)会向左合并到\(y\),当且仅当\(x\)\(y\)间的所有点对应到的\(tag=0\)的点的\(time\)是要小于\(x\)的长度和\(y\)的长度的

然后因为每次都是在最末尾加入的新点\((a,b)\),也就是说,只需要去维护一个栈(从右向左是单调上升的),每次从一直从栈尾弹出\(time\)小于等于\(a\)且颜色不为\(b\)的点,且记录下其中的最大\(time\)\(t\),如果颜色就是\(b\),那么令\(a+=tim-t\)即可

每次的答案就是栈首

复杂度\(O(N)\)

CF2002F1 ✬✡

神秘数学题/ng

不失一般性的假设\(l\geq f\)

\(p\)\(\leq n\)的最大的质数,那么当\(n\)足够大时,\(2\times p>n\),具体的,根据打表可得\(n>1\)就有这条性质了(

所以所有的\((p,i)\)\(i<p\))都是可达的

再来考虑第二大的质数\(p'\),同样当\(n\)足够大时,\(2\times p'>n\),具体的,由打表可得\(n>10\)就有这条性质

此时有所有的\((i,p')\)\(i\in[p,n]\))都是可达的

可以发现,现在\(W_L\)至少取到\(p\)\(W_F\)至少取到\(p'\),于是只需要考虑\(([p,n],[p',m])\)这段范围内哪些是可取的即可,然后可以发现,\((n-p+1)\times(n-p'+1)\)非常小,只有\(39201\),而\(t\leq 1e3\),所以时间是戳戳有余的,这个证明也不会,但是可以打表证明喵

CF2002F2

孩子们我看不懂官方题解写的什么玩意,看英文原文感觉读不通,看翻译的中文看不懂,等谁发了\(tj\)我去学了再补(

CF2002G

看到\(n\)\(20\)的,然后值域是\(2n-1\)的,直接存状态不太行,很容易想到\(meet\ in\ the\ middle\)之类的来减小状态数

考虑\(meet\ in\ the\ middle\),考虑走网格图的过程,无论是从哪个点出发,我们都记录\(sx\)\(sy\)表示当前\(x\)方向和\(y\)方向走了几步,为了方便后面的计算,我们直接令初始的\(sx\)\(sy\)都等于\(1\)

因为从\((1,1)\)走到\((n,n)\)\(sx=sy=n\),也就有\(sx+sy=2n\),所以我们设前一半(从\((1,1)\)走到中间态)取到\(sx+sy=B\times 2n\),后一半(从\((n,n)\)走到中间态)取到\(sx'+sy'=(1-B)\times 2n\),如果直接去\(check\)答案为\(ans\)是否可行,考虑在走的过程中记录下走到的所有边的颜色集合,那么只需要对于前一半中走到的所有状态\(S\)以及\(S\)的子集合塞当前落脚的\(x\),然后后一半走到的状态\(S\),去找在前一半中记录的状态\(2^ans-1-(S\&(2^ans-1))\)中是否存在当前后一半的落脚点\(x\)即可

这样复杂度是\(O(4^{B\times 2N}+2^{(1-B)\times 2N}N)\)的,取\(B=\frac 13\)可得复杂度为\(O(2^{\frac43N}N)\)

然后可以发现,如果\(k\)可作为答案,则\(k-1\)也一定可作为答案,那么就不需要一个个的去\(check\)答案了,只需要每次遍历到一个状态后\(check\)一下当前答案+1是否合法,合法就++,不合法不管即可

复杂度\(O(2^{\frac 43N})\)

CF1994C

若已固定\(l\),只在清零时落脚,则可发现,无论\(r\)怎样,从\(l\)出发会跳一条固定的路线,直到到达\(r\)这个边界

那么只需要二分求出从\(l\)出发的第一个落脚点,然后在这个落脚点处因为\(g\)重置了,所以之后都没有影响了,那么以\(l\)为左端点的答案就是\(n-l+1-\)落脚点的数量

复杂度\(O(N\log N)\)

CF1994D

\(x\)就从\(1\)\(n-1\),每次任意挑出一对\(a\)\(x\)同余且未连通的\((u,v)\),然后给它们连边

如果每一个\(x\)都能找到这样的一组\((u,v)\),那么就能找到答案

考虑什么时候会找不到合法的\((u,v)\),当且仅当每一个模\(x\)的剩余系中都是同一个连通块的点,那么此时一定有连通块数\(\leq x\),而当\(x=i\)时,连通块数为\(n-i+1\),当\(n-i+1\leq i\)时,有\(2i\geq n+1\)

但是如果我们让\(x\)\(n-1\)\(1\),则\(x=i\)时有连通块数为\(i+1\),也就是说,此时有连通块数恒\(>x\),根据鸽巢原理,至少有一个剩余系会被分到两个连通块,所以说一定有解

复杂度\(O(N^2\log N)\)\(\log N\)是并查集的复杂度

CF1994E

考虑每棵树对答案的贡献,发现如果它对答案贡献多次,则可归总为\(1\)次,那么只需要一开始令\(ans\)为最大的\(n\),然后其他的\(n\)一直取它能产生的最大贡献即可

复杂度\(O(K\log N)\)

CF1994F

首先将有\(npc\)的边提出来,发现题目保证这样是连通的

存在回路当且仅当所有的点的度数为偶数,那么根据有\(npc\)的边先算出每个点目前的度数,再考虑加上一些没有\(npc\)的边\((u,v)\),这会使得\(u\)\(v\)的度数产生变化,发现每次是让两个点的度数的奇偶性发生变化,也就是说,整体的度数的奇偶性不变,所以也就要求每一个没有\(npc\)的边构成的连通块都有其内部的总度数的奇偶性为偶

若存在回路,则显然要满足这个条件,大胆猜测是否只要满足这个条件就一定存在回路了,那么就需要找到一种构造方案

对于每个没有\(npy\)的边构成的连通块,提出任意一棵生成树,那么对这个连通块中的点任意两两组队,若当前是点\(x\)和点\(y\),那么只需要将它们在树上的简单路径中的所有边的存在状态取反即可,这个可以树上差分轻易的维护

然后求出所有存在

复杂度\(O(N+M)\)\(O((N+M)\log N)\),取决于是否使用并查集

怎么 queue<pair<int,int>>的空间这么大?直接交上去就\(MLE\)了/youl

Atcoder dwango2015_prelimsE 電波局 ✩✯

小登推荐的\(ds\)

首先肯定会先把坐标轴扯一下,把等边三角形扯成直角等腰三角形,直角在左下方

先说我昨天晚上想到的一个做法,维护那些未被覆盖的空白部分,发现这些部分可以被切割成许多矩形和直角等腰三角形(这个的直角在右上)

然后按\(c_i\)从大到小排序,每次对当前三角形去遍历它和哪些空白部分有交,然后去继续分割

不太会严格证明,但是应该确实只要分隔的方案比较合理,或者有一个合并操作,使得不会出现太多散的块,应该每次插入后新产生的块数是\(O(1)\)

这样应该也是\(O((M+Q)M)\)的,可能带\(\log\)啥的,看维护的方式吧

嗯,想想就很难维护,然后说说小登的做法

扫描线,从下往上扫,然后维护边界的形状,可以发现每个三角形会对应覆盖边界的某一区间,然后就可以类似\(ODT\)的去维护了

当时想的时候没想到\(ODT\)?然后以为不能这样做,有点难蚌了

然后这里一定是每个三角形只会覆盖一个区间,因为每个区间只记录下最优的覆盖它的三角形的话,若当前插入的\([a,b]\),如果原来有\([l,r]\)\([l,r]\in[a,b]\),那么一定把整个\([a,b]\)都给\([l,r]\)覆盖更优,所以插入的时候,直接删除完全包含的那些原区间,然后只有头、尾有交的不会被覆盖,尾有交的那个区间还是归原来那个管,头有交的就直接截取有交的部分,有交的部分归\([a,b]\)管,剩下的还是归原来那个管

那么每次插入的时候,先遍历一遍所有区间,更新一下每个区间的状态并计算答案,一次是\(O(区间数量)\)的,插入因为每次插入\(O(1)\)个区间,所以区间数量是\(O(M)\)的,那么总复杂度就是\(O(M^2)\)的了

QOJ1427 Flip

简单计数题

若在加入第\(i\)个点后,刚好某一个集合满了,那么这种情况的概率就是\((\frac12)^i\)

那么对于一个询问\(a\),有其答案为:

\[2\sum_{i=1}^{2n-1} [i\notin \{a\}] (\frac12)^iC_{i-t_i-1}^{n-1}+[t_i==k](\frac12)^iC_{i-t_i-[i\neq a_k]}^{n-t_i-[i\neq a_k]} \]

前面一半是算的\(a\)中的数在未满的那个集合中的答案,后一半算的是\(a\)中的数在满了的集合中的答案

然后大概把每个部分给分离开就可以预处理单独计算答案了

复杂度\(O(N\sqrt Q)\)

CF917D Stranger Trees

完全图,求生成树个数,很容易的想到\(Prüfer\)序列,然后要求刚好和给出的生成树的交为\(k\),这个显然可以容斥

\(f_i=n^{n-i-2}\times\sum\prod s_i\),若已求出这个\(f_i\),可知\(f_i=\sum_{j\geq i}C_j^ians_j\),那么容斥可得\(ans_i=\sum_{j\geq i}(-1)^{j-i}C_j^if_j\)

那么只需要求出\(f_i\)就可得到答案,也就是要求出就是后面这个\(\sum\prod s_i\),设其为\(g(i)\)

\(dp[x][i][j]\)表示\(x\)的子树内,选了\(i\)条边,其中有\(j\)条与\(x\)连通,转移就树上背包的转移就行

这里的背包复杂度是\(O(N^4)\)的,但是因为有\(j\leq i\)的限制且原本最基础的树上背包就跑不满这个复杂度,所以时间肯定绰绰有余的

那么有\(g(i)=\sum_j dp[root][i][j]\)

总复杂度\(O(N^4)\)

qoj2568 Mountains ✩✯

既然是要求任意一条路的权值和都不能超过\(k\),那么也就是说只要最大的权值和\(\leq k\)即可,那么考虑如何判断一个矩阵是否合法,设\(f[i][j]\)表示从\((1,1)\)走到\((i,j)\)的最大权值和,只要\(f[n][m]\leq k\)即可

可以发现,只要知道了\(f[i][j]\)\(f[i-1][j]\)\(f[i][j-1]\),就能知道\(a[i][j]=f[i][j]-\max(f[i-1][j],f[i][j-1])\),也就意味着\(f\)和矩阵是一一对应的关系

那么现在只需要求出合法的\(f\)的数量即可

这里是个\(trick\)

因为\(f[i][j]\)一定在\(i\)方向和\(j\)方向分别不降,若让\(i\)\(0\)\(k\)的遍历,每次将\(\leq i\)\(f\)加入集合中,可以发现,会形成一条从左下到右上的轮廓线,它从\((n,0)\)开始,以\((0,m)\)为结尾,中途只向\(x-1\)\(y+1\)的方向走,那么这\(k+1\)条轮廓线就是\(k+1\)条存在重合的从\((n,0)\)\((0,m)\)的路径

那么我们让第\(i\)条轮廓线向右下移动\(i-1\)格,可以发现,这样就能变成从\((n+i-1,i-1)\)出发到\((i-1,m+i-1)\)的路径,且这\(k+1\)条路径两两无交

这样就能转换成\(LGV\)引理了

复杂度\(O(N^3\log MOD)\)

CF1730F Almost Sorted

发现\(p_{q_j}\)要么\(p_{q_i}\),要么\(\leq p_{q_i}-k\)

进一步的,可以发现,对于几个数,它们的最大值和最小值的差\(\leq k\),那么这几个数可以任意排列,都合法

于是考虑\(dp\),状态\(dp[i][s]\)表示放入了\(1\sim i\),目前\(i+1\sim i+k+1\)中的\(s\)已放入

然后\(dp\)即可

复杂度\(O(NK^22^K)\)

P6647 [CCC2019] Tourism

有种比较暴力的做法,就是设\(dp[i]\)表示\(1\sim i\)的答案,然后每次转移都有\(dp[i]=-INF+\max_{j\in[i-k,i-1]} \{dp[j]+\max_{l\in[j+1,i]} a_l\}\),这样肯定能保证每次的转移数/天数都是最小的

复杂度\(O(N\log N)\),不知道能不能\(O(N)\)啊,估摸了一下感觉不太行,也许行,懒得想了

然后这个转移可以优化一下,发现\(dp[i]\)一定是从\(dp[0]\)转移了\(\lfloor\frac ik\rfloor\)来的,所以可以对\(i\)\(\lfloor\frac ik\rfloor\)分层,然后当前层的\(i\)只会从上一层转移来

复杂度\(O(N)\)

ARC117E Zero-Sum Ranges 2 ✩✯

首先知道,若\(A_l+A_{l+1}+...+A_r=0\),那么有前缀和\(sum_r=sum_{l-1}\)

那么\(k\)就是前缀和相同的点的对数

把前缀和放到坐标轴上,变成一个折线图,发现只要起点是\((0,0)\),终点是\((2n,0)\),就一定是\(n\)\(+1\)\(n\)\(-1\)

一张折线图的\(k\)就是相同高度的点的对数,且可知相邻点一定有\(\Delta=1\)

这里有个\(trick\),就是想象一条水平的直线去截这个折线图,然后这个直线从顶向下的扫,只保留直线上方的图像,若当前直线为\(y=a\),则所有\(sum_i=a\)都在直线上,此时就很好统计\(sum_i=a\)的数量,如果能记录下之前的那些对数,则得到了所有\(sum_i\geq a\)的对数,且若存在两个\(sum_i=a\)在上方中相邻,那么下次一定会用\(sum_i=a-1\)把它们隔开,因为\(sum_i=a+1\)已经固定

那么考虑\(dp\)状态,\(dp[a][j][k][l]\),表示当前\(y=a\),对数为\(j\)\(sum_i=a\)的相邻点数为\(k\)(将\(sum_i=a\)旁边没有数也视作一个相邻),已确定了\(l\)\(sum_i\)

那么转移时,\(sum_i=a-1\)最多插入\(2n+1-l\)个,且只能插入相邻的\(sum_i=a\)之间或两端,插入两端时要保证原本的两端是\(sum_i=a\)

然后可以发现\(a\)其实无用,\(a\geq0\)时都是一样的转移,若\(a<0\)后,考虑将所有\(<0\)的段都翻上去,就变成\(>0\)的了,这样只需要在统计答案的时候看一次此时插入的\(0\)的数量为\(t\),然后乘上一个\(2^{t-1}\),看是否要翻转相邻两个\(0\)间的段

复杂度\(O(N^5)\)

CF1789F Serval and Brain Power ✬◈

非常欺诈性的题

考虑暴力,枚举\(k\)个分段点,然后求出所有段的最长\(LCS\),复杂度\(O(N^{2k-1})\)

然后因为跑不慢,\(k\leq3\)可过

\(k=4\)时,是包含于\(k=2\)的情况的,于是不管

\(k>4\)时,此时一定存在一个\(i\)使得\(T'\)\(s_{[i,i+15]}\)的子序列,否则\(k\leq 4\)

于是就可以枚举\(i\),然后枚举\(2^{16}\)级别的状态\(S\),再回原串去遍历一下即可

这部分的复杂度是\(O(N^22^{16})\)

「2021 集训队互测」这是一道集训队胡策题

考虑枚举列为\(1\)的数量\(i\),则剩下\(n-i\)个列为\(0\)

发现对于每一行,如果这一行中\(1\)的个数\(<i\),那么这一行必选\(0\),这一行中为\(1\)的列必选\(1\),否则若\(>i\),必选\(1\),这一行为\(0\)的行必选\(0\),那么现在就确定了所有行中\(1\)的个数\(\neq0\)的行的选择以及部分列的选择

设必选\(0\)的列的集合为\(S_0\),必选\(1\)的列的集合为\(S_1\),那么首先有\(S_0\cup S_1=\empty\),发现一个行中\(1\)的个数为\(i\)的行,无论它选\(0\)还是\(1\),都能确定行中为\(1\)的列一定选\(1\),为\(0\)的列一定选\(0\),那么也就是说如果存在行中\(1\)的个数为\(i\)的行,那么列选\(0\)还是\(1\)就已经确定了,所以这里还要求所有行中\(1\)的个数为\(i\)的行都长的一样,然后\(S_0\)是选\(0\)的列的子集,\(S_1\)是选\(1\)的列的子集,方案数就是\(2^{cnt}\)\(cnt\)是行中\(1\)的数量为\(i\)的行的数量

如果不存在这样的行,那么方案数就是\(C_{n-|S_0|-|S_1|}^{i-|S_0|}\)

复杂度\(O(N^2+\frac{N^2}w)\)\(N^2\)是预处理组合数的复杂度,用\(bitset\)维护主体部分即可

posted @ 2024-08-05 20:20  LuoyuSitfitw  阅读(219)  评论(0)    收藏  举报