8月做题记录

8月做题记录

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

PTZ summer 2020 Day1 I

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

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

复杂度O(QlogWlogN)

PTZ summer 2020 Day4 E

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

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

i+j+min(sumasufajsumapreai,sumbsufbjsumbprebi)

其中sumai表示a序列中前i个元素有几个2preai表示a中第i1的下标,sufai表示a中倒数第i3的下标,剩下的同理,且式子中的ij要满足preai<sufaj&&prebi<sufbj

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

复杂度O(NlogN)

CF1656H ✩✯

有一个显然的贪心做法,就是每次从SA中删去元素xxlcm(SB)),从SB中删去元素yylcm(SA)),然后一直循环往,最后如果有一个集合删空了就不合法,否则最后剩下的SASB就是答案

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

xlcm(SB)gcd(x,lcm(SB))=xlcmySB(gcd(x,y))=x

证明:

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

此时说明x存在某一因子p,它的幂k是大于所有yp的幂次的,也就意味着xlcm(SB)

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

然后复杂度看似是O(N2logNlogW)的,实际是O(N2(logN+logW))

考虑当删去一个y时,对一棵x的树的影响,gcd(x,y)的复杂度实际上是O(logmin(x,y)gcd(x,y))的,那么在树上修改一个地方后,也就是重新计算了一条从根到叶子的链的复杂度就为O(ilogmin(xi,yi)gcd(xi,yi)),这是等价于O(logimin(xi,yi)gcd(xi,yi))的,发现min(x,y)gcd(x,y)相当于是lcm的变化值,那么所有lcm的变化值相乘就是lcm总的变化值,所以修改一次的复杂度就是O(logn+logW)

PTZ winter 2020 Day5 D

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

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

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

inxi表示弧x与最小弧相交的长度,outx为不相交的长度,有inx+outx=lenx,设Len表示最小弧的长度

第二类中的弧x和第三类中的弧y有交当且仅当:inx+iny>Lenoutx+outy>1e6Len

也就意味着如果把二类点用(inx,outx)表示,三类点用(Leniny,1e6Lenouty)表示,那么合法当且仅当不存在三类点处于二类点的非严格右上方

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

复杂度O(N2logN)

CF1270H

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

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

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

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

prep表示mini[1,p]aisufp表示mini[p,n],可以发现,连通块的数量等同于prep1>sufpp点的数量

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

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

复杂度O(QlogN)

PTZ winter 2021 Day9 A

树剖+dfn序乱搞题

根据dis(u,v)=depthu+depthv2depthlca(u,v),把三个depth拆开处理,可以发现depthudepthv都是好弄的,考虑如何处理depthlca(u,v)

若记录cntu表示u子树内的所有点的a之和

那么对于点u向上跳时,若当前跳到了x,上一步是las,那么depthx作为depthlca(u,v)的系数是2×(cntxcntlas)

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

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

对于操作二,则ulca的路径上的点xCnt是加上depthudepthx+1,这也是个一次函数,lca到根就是加上dis(u,v)+1

O(Qlog2N)

ARC181A

首先就Pi本身就是1n的话答案为0

答案为1当且仅当存在x满足Px=x,且maxi[1,x1]Pi<xmini[x+1,n]Pi>x

剩下的情况答案为23

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

O(N)

ARC181B ◈✯

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

首先可以根据XY0/1的数量列出k1|S|=k2|T|的式子

然后先判一下,如果k10&&k2=0,不合法,否则当k1=0||k2=0直接合法

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

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

复杂度O(N)

ARC181C ◈✯

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

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

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

那么可以发现,现在就递归成了一个子问题了,但是如果依旧按照上述方式给P2行和Q2列赋值为0,那么不会满足SP1<SP2,因为SP2没有1

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

复杂度O(N2)

[CF1548E] Gregor and the Two Painters ✬✩

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

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

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

preai表示最大的满足ajaijj<i),sufai表示最小的满足aj<aijj>i),prebisufbi同理

可以发现,一个ai+bjai+bj的话,aiaibjbjh至少会满足一个,这也是我们只需要去找到最大的preai和最小的sufai即可的原因

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

mai=min(maxk[preai,i]ak,maxk[i,sufai]ak)mbj=min(maxk[prebj,j]bk,maxk[j,sufbj]bk),那么一个点$(i,j)是代表点当且仅当:

{ai+bjxai+mbj>xmai+bj>x

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

CF1209G2 ✯✩

对于值i,设其最左端在Li,最右端在Ri,将[Li,Ri)的所有点的cx1

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

然后把颜色i的数量挂到Li上即可

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

Gym103469I/petrozavodsk summer 2021 Day 3 I ✯✩

肯定要容斥,用CN3减去存在有交的方案数就是答案

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

然后一般的题会分别求出c1c2c3然后把它们加起来,但是这道题不是这样

di表示所有矩阵中与矩阵i有交的矩阵数量,那么有:di(n2)=2c1+4c2+6c3Cdi2=c2+3c3,两式相消后可得c1+c2

di可以扫描线随便求

现在就只需要求出c3即可

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

这启发我们先去固定这个最小的ui,即先确定一个矩阵,满足这个矩阵的ui是三个中最小的那个,然后考虑找另外两个矩阵jk,首先它们两个肯定要满足djuiujdkuiuk,然后再来考虑横坐标,可以发现,要满足交集不为空,只需要满足两两间交集不为空即可,首先也要满足[lj,rj][li,ri]有交、[lk,rk][li,ri]有交,然后还要满足[lj,rj][lk,rk]有交,两个不确定的矩阵有交不好处理,但是求无交就好处理了,因为无交时只需要满足其中某一个矩阵的右端点在另一个的左端点的左侧,所以这里也容斥一下,又因为[lj,rj]/[lk,rk][li,ri]是有交的,则[lj,rj][lk,rk]间无交的情况一定满足其中一个的右端点[li,ri]内,另一个的左端点在[li,ri]内且右端点在左端点左边,所以只需要求出[li,ri]内有多少对左右端点满足右端点在左端点左边,依旧是扫描线插入删除jk

复杂度O(NlogN)

XX opencup GP of Poland E

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

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

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

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

总复杂度O(klogN+Qlog(N+M))

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

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

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

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

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

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

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

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

ARC181D ◈✯

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

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

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

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

复杂度O(NlogN)

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

ARC181E ✩✬

很牛的题!

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

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

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

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

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

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

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

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

复杂度O(Mlog2N)

qoj8008

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

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

也就是说,最优方案一定是先随机走,最后再走ki

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

复杂度O(NK)

CF741C ✯✩

我不会构造题/ng

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

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

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

复杂度O(N)

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

CF1656G

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

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

合并环AB,若存在xAyB,且bx=by,那么直接交换bxby即可把两个环合并

若不存在,则任意取出xAyB,要求xnx+1yny+1,那么令bx=bybnx+1=bny+1by=bnx+1bny+1=bx即可

对于n是偶数,显然通过上述构造一定有解,对于n是奇数,无解当且仅当an2a中只有一个

复杂度O(NlogN)

调整法

CF1844E ✬✩

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

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

设矩阵为[a bc d],可以发现,对于任意一种合法的情况,都有a+db+cmod3,这个很好证明,从a+b+c+d入手去证明即可

那么变换一下有,adcdmod3,这代表对于同一个x任意一个y,有它们的cx,y+1cx,y是同余的,accdmod3,这代表对于同一个y任意一个x,它们的cx+1,ycx,y是同余的

这两个条件对矩阵合法来说是充分必要的,设ax表示cx,y+1cx,yby表示cx+1,ycx,y,那么现在再来找ab间的关系

然后以为相邻的格子不能相同,所以ab的值均为1/2

对于限制条件,设x=min(x1,x2)y=min(y1,y2),若其是 左上角和右下角相等类,那么有axby,若是 右上角与左下角相等类,有ax=by

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

复杂度O(N+M+K)

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

2022 ICPC Nanjing C Fabulous Fungus Frenzy/Gym104128C

坏了,看构造题啥都是trick

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

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

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

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

Ptz Winter 2020 Day6D Split in Sets

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

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

若拥有这一位的数不超过k1个,此时一定是拥有2d的每个数单独放到一个盒子中严格最优,证明考虑拿出x1,x2<2dy,如果把x1y放在一起,x2单独放,产生的贡献为x1+y(x1|y)+x2,但是如果x1x2放在一起,y单独放,产生的贡献为x1+x2(x1|x2)+y,显然(x1|x2)<(x1|y),除去这种情况外,更不可能把2dy1,y2y1y2放在一起,证明类似

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

复杂度O(N(logV+logN))O(NlogN)是最后一层算答案时用的

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

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

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

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

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

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

NM同阶,复杂度O(NlogN)

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

ARC181F ✬◈✩

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

  • ai=ai1,则pos不动
  • 若与pos相邻的点中存在代表ai的点,则将pos移动到这个点上去
  • 否则新建一个点pospos挂在pos上且pos代表ai

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

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

知道了最终pi的组成以及答案的运算方式,就可以来考虑如何计算答案了

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

那么现在就得到了一个链的序列qi,为了方便dis的计算,处理出链上每个点xst的距离dx,对于要求的最终序列pi就会需要满足p1=stpn=eddpidpi1[0,1],当dpi=dpi1+1时,一定有pi=qipi1=qi1

来考虑dp转移,设dpi表示当pi=qi时,前i个的最小答案,prex表示在{qi}中,x上一次出现的位置

dp[i]={dp[i1]dqi=dqi1+1dp[preqi]+j=preqi+1i1|dqjdqi|preqi1

因为preqi是上一次出现的位置,所以一定有所有的dqj都大于dqi或都小于,于是前缀和即可

复杂度O(N)O(NlogN)

CF1646F

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

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

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

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

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

OpenJ_POJ C23C Empty up a Bottle

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

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

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

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

qoj895/Ptz Winter 2021 Day4I Color ✬✡

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

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

然后对于每种颜色的边,可以维护一个大小为m+12的集合,其中有三种set0set1set2set,是根据set内的大小划分的,设这三种set的数量为c0c1c2

那么有c0+c1+c2=m+12,而我们能确定的是c1c2,所以只要c1+c2m+12恒成立即可

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

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

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

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

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

UOJ354 新年的投票 ✬◈

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

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

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

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

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

再来考虑sub 2

sub 3的二进制数量票数启发,考虑将n个点划分成四组,大小分别为1248,然后每个组内的都合并为一个,依旧用sub 3的做法,那么不合法当且仅当每一组都是0,情况数为C10×(C20+C22)×(C40+C42+C44)×(C80+C82+C84+C86+C88)=2048小于2100

最后考虑sub 4

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

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

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

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

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

将式子化简后并乘上128可得128s7+5824s6111776s5+1172080s47246232s3+26389636s252371534s+43648605

然后再把s=xi代入就能得到关于xik阶多项式了,然后没一项分配一下即可

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

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

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

然后如果在编号确定的情况下,可以选择直接把这条直线设置成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(nmod2)个点在线上,而其余的点中有一半是正确的,也就是有N12个是正确的

OpenJ_POJ C24D Number Solidity

ab肯定都是质因数且bx的最小质因数,且ax的最大质因数开始操作一直到最小质因数,这样就能保证b一直能取到最小的那个质因数

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

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

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

CF2002C

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

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

CF2002D1/CF2002D2

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

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

  • 第一种

设点xDFS序列的第posx位上,对于点u和它的儿子v,若合法会有[pos,posv+szv1][posu,posu+szu1],只要所有的u都满足条件,这个DFS序列一定就是合法的

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

这种其实就是平常用的[dfnv,dfnv+szv1][dfnu,dfnu+szu1]的变形,比较常见,第二种方法不太常见,至少这是我第一次见

  • 第二种 ✡

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

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

CF2002E

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

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

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

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

每次的答案就是栈首

复杂度O(N)

CF2002F1 ✬✡

神秘数学题/ng

不失一般性的假设lf

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

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

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

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

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

CF2002F2

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

CF2002G

看到n20的,然后值域是2n1的,直接存状态不太行,很容易想到meet in the middle之类的来减小状态数

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

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

这样复杂度是O(4B×2N+2(1B)×2NN)的,取B=13可得复杂度为O(243NN)

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

复杂度O(243N)

CF1994C

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

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

复杂度O(NlogN)

CF1994D

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

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

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

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

复杂度O(N2logN)logN是并查集的复杂度

CF1994E

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

复杂度O(KlogN)

CF1994F

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

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

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

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

然后求出所有存在

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

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

Atcoder dwango2015_prelimsE 電波局 ✩✯

小登推荐的ds

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

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

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

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

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

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

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

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

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

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

QOJ1427 Flip

简单计数题

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

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

2i=12n1[i{a}](12)iCiti1n1+[ti==k](12)iCiti[iak]nti[iak]

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

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

复杂度O(NQ)

CF917D Stranger Trees

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

fi=nni2×si,若已求出这个fi,可知fi=jiCjiansj,那么容斥可得ansi=ji(1)jiCjifj

那么只需要求出fi就可得到答案,也就是要求出就是后面这个si,设其为g(i)

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

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

那么有g(i)=jdp[root][i][j]

总复杂度O(N4)

qoj2568 Mountains ✩✯

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

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

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

这里是个trick

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

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

这样就能转换成LGV引理了

复杂度O(N3logMOD)

CF1730F Almost Sorted

发现pqj要么pqi,要么pqik

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

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

然后dp即可

复杂度O(NK22K)

P6647 [CCC2019] Tourism

有种比较暴力的做法,就是设dp[i]表示1i的答案,然后每次转移都有dp[i]=INF+maxj[ik,i1]{dp[j]+maxl[j+1,i]al},这样肯定能保证每次的转移数/天数都是最小的

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

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

复杂度O(N)

ARC117E Zero-Sum Ranges 2 ✩✯

首先知道,若Al+Al+1+...+Ar=0,那么有前缀和sumr=suml1

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

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

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

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

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

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

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

复杂度O(N5)

CF1789F Serval and Brain Power ✬◈

非常欺诈性的题

考虑暴力,枚举k个分段点,然后求出所有段的最长LCS,复杂度O(N2k1)

然后因为跑不慢,k3可过

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

k>4时,此时一定存在一个i使得Ts[i,i+15]的子序列,否则k4

于是就可以枚举i,然后枚举216级别的状态S,再回原串去遍历一下即可

这部分的复杂度是O(N2216)

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

考虑枚举列为1的数量i,则剩下ni个列为0

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

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

如果不存在这样的行,那么方案数就是Cn|S0||S1|i|S0|

复杂度O(N2+N2w)N2是预处理组合数的复杂度,用bitset维护主体部分即可

posted @   LuoyuSitfitw  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示