2024.4 总结 / 做你身后影子久了 都忘了真实自我

P2495

考虑建立虚树,先求出原树的欧拉序,然后对于输入序列,按照 dfn 排序后取出相邻位的 LCA。

对于这些关键点,拓展出右端点,然后按照欧拉序排序,再模拟 dfs 在上面做 dp 即可。


AGC056C

是谁不会差分约束?是谁不会差分约束?是谁不会差分约束?

首先套路的给 0/1 权值 1/1,然后考虑限制条件:

  • |SiSi1|=1

  • Sl1=Sr

我们可以使用差分约束去写这个条件:

  • SiSi1+1

  • Si1Si+1

  • Sl1Sr

  • SrSl1

然后现在的问题是漏了一个 Si1Si 以及字典序最小化(

先思考字典序最小化的含义,意思是 d 的字典序尽量大。

对于差分约束系统,有定死一个值(S1)之后其它位置最大化的性质,因为小于等于号祂往大的取。

不等于号可以考虑约束过程,对于一条 (u,v):0,显然 u,v 同奇偶性,意思是相邻边(显然 ii+1 奇偶性不同谢谢喵)转移肯定是通过可爱的 1 边。


P4323

捏一下树哈希直接过了,没取模啊啊啊?


CF839E

贪心的想,不难发现分配尽量给予团/平均更优,然后可以证明选团最优秀,如果不选团,当前代价分配进团会更优秀。

然后就变成了一个无向图最大团问题,这个东西我印象中不太做的了,上一次见这种还是随机化过掉了(?

那怎么做呢,由题解可得记忆化可过,怎么回事呢......?

转移枚举 lowbit(x),然后就是 max{Ans(xlowbit(x)),Ans(x&st[lowbit(x)])}

n/2 层的状态,一个决策只能拓展两个决策,状态数 2n1 挺好的。

n/2 层状态,后面的状态 S 不包含小于 n/2 的点,所以本质上状态数 2n1 挺好的。

事实上折半搜索或者使用科技也是不错的选择。


CF1725K

纯 ds 题我做起来真的很开心!我爱数据结构!(

先分析操作,值域 [l,r]xaxy,然后查询 ax

比较显然的想法是做一个集合的变换,然后要合并集合,将一个点从集合剥离,查询一个 ai 在那个集合。

如果没有修改一个启发式合并状物就可以通过了,分析一下,这个题目修改所新创建的节点数其实不是很多,所以暴力做应该还是可以对的......?

标签有一个 dsu,ai 上面不是很直接做,我们新建一层节点,不妨考虑每一个节点 i 外向连一个 lnki,表示 ai=val[lnki] ,然后合并直接在 lnki 连出的节点上面做。我们开一个 set 状物保存现有的值 & 值对应的自我编号(方便查询)。

  • 对于 [l,r]x,直接在 set 中搜出合法值跟 x 并查集合并即可

  • 对于 aix,直接新建一个节点 val[t]=x,然后 lnkit 即可

  • 对于查询 ai,查询 lnki 集合的主,然后输出 val[mas] 即可

一个点加一次删一次,set 带个 log,dsu 带点常数,还是挺好的复杂度的。


CF1654F

打表不难发现对于一个 k=2d,就是 2d1 一大块奇偶变换。

然后对于 k=2di(didj),其实每个 di 做一次可以得到答案,证明自己想象一下就会了。

那么不难得到的性质有 F[k][d]=F[k][d1]+F[k^2d1][d1],其中 F[i][j] 表示 xor i 的时候的前 2j 位组成的字符串。

然后直接在上面倍增 SA 即可,奇形怪状 SA 题。


CF643E

诈骗题,因为不用 mod 所以只考虑深度 60 里面的影响即可。

f[i][j] 表示 i 的子树深度不超过 j 的概率,那么答案就是 j=160(i1)×(f[i][j]f[i][j1]) 啦。

现在考虑这个东西的转移 f[i][j]=f[son][j1]+12 ,挺好的。

这个东西在 f[][]=1 的时候没有影响,考虑新加入一个点,是 f[u][0] 在往上做一个阶梯形的贡献,一个节点可以 O(1) 做掉,那么就做完了 qwq


CF825G

傻逼题,byd 这个傻逼输入。

我们考虑一个树的性状,应该是一个边缘是黑点的树状物挂上一些白点。

对于外挂的白点,不能走到另一块外挂的白点,能走到任意树状物里的点 & 到树状物路径上的点。

对于树状物里的点,可以走到任意树状物里的点。

那么不妨令树状物里面的最小编号为 jury,以树状物为跟的树的跟到 i 的路径上的节点最小编号为 vali,那么对于询问:树状物里的点的答案为 jury,树状物以外的点的答案为 min{vali,jury}

然后现在要动态维护这个树状物,首先不难发现第一个黑点永远在树状物里面,不妨以祂为根求出 vali

对于加入黑点 x,直接将 rootx 的路径合并进树状物,jury=min(jury,valx),显然可以重复合并。

对于查询,直接输出 min{jury,valx} 即可,显然 val 多取几个点树状物里的点答案还是一样的。


CF838D

每个点不等价并且非常难以计算,我们考虑首尾用额外点 n+1 连起来成为一个环来尝试简化问题。

现在问题是随便选择一个点和方向,将当前唐龙放到第一个空的位置,如果 n+1 被放那么不合法。

首先从 n+1 开始放的肯定不合法,这样子所有点都可以选,所有点都等价,总方案是 (n+1)m,合法概率是 n+1mn+1


CF718C

数列有两个思路:等比数列的通项 / 矩阵乘法,发现公式直接线段树好像就能做,然后发现 ** 的这神笔玩意儿 5 是二次非剩余。。。

我们考虑矩阵乘法,这个东西有结合律和交换律,那么我们可以在线段树上面套矩阵运算,然后没了。


P1829

随便反演构造一下这个数据范围整除分块乱套筛子随便过.......?


P3172

随便推推再反演一下,整除分块加个 μ 的筛子。


P3768

反演一坨东西然后确实是简单数学题。


CF513E1/2

考虑最终的序列 s1,s2,...,sk,其实有贡献的可以只有极值喵,然后贡献分别是端点 +1/1,中间段 +2/2,我们可以设计状态 f[i][j][0/1/2/3] 表示前 i 个数,这个是第 j 段,这个段的权值是 +/ 的 or 这个段权值为 +/ 时的最大贡献。

对于三种不同的段 j=0/.../k 我们可以分别转移,需要注意的是最终的答案的高低变换次数未必等于 k,但是又不能随意转移,在第三种转移加一个一位的同方向任意转移即可。

上述这样做其实与题面不完全相同,但是取 max 之后取到的答案一定是合法最优解。


CF1446D1/2

考虑 D1 怎么做,首先有一个小结论,答案区间必然包含总区间的众数 mas

假设一个小区间不包含 mas,那么往两边拓展一定能使得 mas=other,因为是先不及再超越。

那么可以枚举一个数 x,然后赋权值 1/1,考虑前缀和 Sl=Srrl 即可。

再考虑 D2 怎么做,可以根号分治,对于数量超越 t=n 的按照 D1 的做法,然后对于数量小于 t 的一起做。

具体而言,枚举 x[1,t],然后双指针使得区间每个数个数不超过 x,然后再去取 rl+1 的贡献即可。


P2481

考虑拆分成形如 1111+111+11 之类,算 g[i] 表示 11...11modp=i 的个数,首先有个循环节不是很长给它拆开。然后 dp 背包即可,要套一个组合数。


P3286

首先不能每一个按照位考虑,因为那样子很困难,那么我们只能按位考虑。

对于任意一位,移动 mid=1,...,len,不难看出代价是一个单谷的,于是乎,我们可以先求出移动到 1 的代价,然后再考虑每一位 i,如果 midi1i 的代价更好就加入代价即可,不难验证这是对的。


P4377

不难发现二分之后是背包。


P3199

不难发现二分之后是判断负环。


4322

不难发现二分之后是树形 dp。


P3705

不难发现二分之后是网络流。


CF1442D

现在是乱搞时间!

如果没有这个 k 的性质并且通过给与选一个的增量,那么任意选会选任意前缀正,然后考虑一个单调递增,没有限制选整段会最好,要不全选要不全不选,即使有增量影响,这么做的问题是不一定可以凑出 k,其实这时候已经可以大胆猜测只有一个非整段了。

每一段肯定是一个凹包装物,不难发现对于 k 和最好价值 ans 应该大体是一个凸包套凹包状物因为不会叉着选段(意思是拆开选的段最多只有 1 个,原因是交换更优)否则更差 & 这个整段状物肯定是选越多收益率越差。

枚举非整段,然后发现伤心的发现对于整段的凹包不太能贪心,因为上文性质没有可以贪心的余地。

那我们直接考虑背包,然后发现不会做,事实上可以分治背包,具体而言:

  • 对于一段 [l,r],取一个 mid=l+r2

  • 插入 [mid+1,r] 中的物品,递归处理 [l,mid]

  • 复原背包,插入 l,mid 中的物品,递归处理 mid+1,r

然后我们会发现 l=r 时候就是我们要的 l 这个位置的背包,复杂度 O(knlogn),可以通过。


CF1592F1

首先 (n,1),(1,m) 的操作可以用 (1,1) 的操作平替,是无用的,手玩之后不难猜测 (n,m) 的操作最多用一次,证明的话可以画图,发现对于那种 |- 状物可以用 (1,1)6 次完成。

然后考虑一个点要不要操作?显然要考虑一个覆盖区间包含当前点的点个个数,事实上 a 就是 sum 的后缀和的了,差分可以还原喵,那么 (i,j) 是否需要操作实质上是 a[i][j]^a[i+1][j]^a[i][j+1]^a[i+1][j+1]

然后考虑在 (x,y) 用操作 (n,m) 的影响,其实就是用 3 的代价翻转了 (x1,y1),(x1,m),(n,y1),(n,m)d 罢了,这个直接做就行了。


CF1592F2

沿用 F1 的做法,首先只有 (1,1),(n,m) 有用,然后考虑后缀差分还原初始操作数组,然后再考虑有用的操作对后缀差分数组的影响:

  • (x,y)(1,1):将 (x,y)d 取反

  • (x1,y1)(n,m):将 (x,y),(n,y),(x,m),(n,m)d 取反

但是这还不够!我们还需要一些性质才能做题。

  • 对于同一行 / 列,(n,m) 这种操作只会用一次 >w<

考虑用了两次,其实还是一个长方形的贡献嘛,完全可以用 (1,1) 替代 qwq

  • 对于 (x1,y1),只有当 (x,y),(x,m),(n,y)d 都是 1 时才会用 (n,m) 的操作

假设这三位有一个是 0,因为那个同行列不多次的性质,对于新增的 1 只会用 (1,1) 带来的翻转,然后就不优了。

然后我们就可以做题了,建立二分图,行/列 为 左/右 部分,对于符合性质的 (x,y) 连接,然后做一次二分图匹配,一个匹配带来 1 的贡献。

然后再去考虑可怜的 (n,m)d,还有一个 +1/1 的贡献,直接加上去就好了,这个贡献很小,不会出现因为这个的影响导致上面所得更劣。


P3288

不难发现搓一下建图,套个二分之后是判负环。


AT_joisc2019_j

首先分析后面那一堆绝对值,有一个下界 2(cmaxcmin),然后这个很容易构造出来,顺序即可,那么就是了。

然后考虑按照 c 排序,那么 f[i]=max{val(j,i)+2×(cicj)},其中 val(x,y) 表示 [x,y] 这个区间中最大的 kv 的和,主席树维护即可。然后这个东西有决策单调性,可以分治求解。


P5787/CF813F

把操作打在以时间为轴的线段树上面,这样一个时刻的答案其实是线段树上面对应的跟到叶子的路径的操作的答案。

那么可以考虑一个线段树分治,不难发现上面那个东西跟 stack 其实差不多喵,那么我们可以遍历这个线段树,到某一位加入点上的操作,然后继续遍历,遍历完之后撤回,需要一个可撤销的拓展域并查集,这样子到跟的时候就可以有对应的 dsu 和 可行性 答案。


P5227 / P10075

首先有一个显然的做法,可以线段树分治,就是处理一下出现区间,我不多说,因为也有哈希做法。

对于原图,求出一棵生成树,此时边可以区分为树边/非树边。

我们考虑用非树边去覆盖树边,具体而言,给非树边随机赋值 (u,v):val,然后用这个 val 去覆盖对应的树上路径,让路径权值 lenx 全都 ^val,这样子每个树边上面都对应的一个数 lenx 可以表示一个被覆盖集合。

然后再考虑怎么判定?

  • 一条树边被删除,需要两边有非树边连接,意思是要求 lenx0 谢谢喵

  • 两条树边被删除,会被拆成三个联通块,在考虑这两条边的 lenx,leny0 的情况下,只要保证去掉 lenxleny 的跨越部分,仍然有即可,意思是保证 lenxleny0

  • 三条树边被删除,考虑挑出一个叶子,可以归纳,那么就是 lenilenjlenk0,如果不挑出叶子,两边分别做也能归纳

  • 四条树边被删除,同 三,可以归纳

然后非树边的删除怎么做?这个是直接任意异或回去就能消除了吧 qwq

综上所述,可以枚举边集,算出 xor 和,合法的情况所有的 xor 和非 0。


P4219

怎么有人企图写一些表面上算法简单的做法然后写假了 /dk

查询的时候让边消失,直接线段树分治即可,需要一个 dsu 可撤销,一个边的答案其实就是左右两部分的大小 l,r 相乘。


CF938G

也就一个离散化然后线段树分治加个可撤销的带权并查集和线性基罢了对不对???/fn

首先考虑一大堆的离线操作,这样子变成了很多个 [tl,tr] 时间有一条边 (x,y):d,放到线段树上面做分治,依次按栈序遍历删除可得到时刻情况,然后下文的任意操作写成可撤销状的,然后这个是只增的图了捏。

我们按照最大 xor 路径的做法,我们是做任意生成树路径,然后在线性基里面放环。

这个路径因为 xor 性质较好可以直接算到根的,设 x 的到路径的 xor 值为 lenx,我们考虑怎么在加边的同时维护这个东西。

对于加边操作,非树边放环这个相对好做,判断如果在一个集合,在线性基中加入 lenxlenyd 即可。

但是怎么合并两个树呢,dsu on tree 什么的也太丑陋了吧 /wq

事实上我们可以直接对根进行合并,具体而言合并 x,y 的祖先 xx,yy,我们可以直接在 xx,yy 中加 lenxxlenyyd 的边来取代这个操作,手玩一下不难发现这样是等价的谢谢喵,考虑走上面那一条 d,相当于走 xxxyyy,同理直接走上面那一条可以用下面的替代,非要很具体可以画图手玩一下。

这样子只需要一个带权并查集,比如合并 xxyy,把权值打在 xx 上面,查询 leni 的时候就是并查集上面的路径 xor 和啦 >w<


CF633H

首先有一个比较一眼的莫队套矩阵套线段树之类的做法,搞笑,暴力能过。。。。

考虑先对 a 排序,这样子就可以从小到大考虑每一个 ai 的贡献,具体而言,先预处理 fib,然后记录 cntilimiti 表示询问 i 已经加入了的个数和当前最大值,然后直接加就行了。


CF83D

首先对题目进行转换,不难发现只有 kP 的时候有答案,不然 k 肯定可以被前面的一些数乘出来,如果是 k 的倍数那一定是前面某些数的倍数。容斥一下,题目变成求解 [1,x] 中最小质因子为 k 的个数。

考虑容斥,在 x 里面 k 的倍数有 xk 个,然后减去不合法的,注意到此时 k 有一种极大性,意思是可以任意去除,我们递归的时候除掉才能算吧。不妨设 x,k 的答案为 f(x,k),如果 kP 那么有下柿,否则 f(x,k)=0 >w<

f(x,k)=xki=2min(xk,k1)f(xk,i)

考虑时间复杂度,x 那部分一个递归整除分块是杜教筛复杂度,然后第二维只有质数有效,乘一个质数个数,那么 O(kn34) 是一个极度跑不满的上界,复杂度是 O(能过)


P3792

一眼哈希,但是怎么有人要写这么久,怎么有人不会 st 表 /fad

先 rmq 一个区间 max/min,然后就知道理论要哪些数,哈希一下数的 平方和 & 异或和 即可。


CF1372E

平方题肯定卷在一起更优秀,不难发现第一列肯定可以给满,这启发我们可以这样子做一个最优解:给列放一个排列作为优先级,按照优先级填,每次尽量多填。

那么我们可以区间 dp,用 f[l][r] 表示区间 (l,r) 的答案,c[l][r][i] 表示 i 在区间 [l,r] 优先级最高时 i 的那一列可以取到多少 1,那么显然 f[l,r]=max{f[l][i1]+f[i+1][r]+c[l][r][i]}c 可以写个小容斥。


P8329

Lgx_Q:写这个题,容斥套容斥就秒了。

chelsy_qwq:??????然后感觉搞不明白。

我们考虑计数,设 f(S) 表示第一课树叶子节点集合为 S 的方案数,g(T) 表示第二棵树叶子节点集合为 T 的方案数,那么显然:

Ans=S,T{1,...,n}f(S)g(T)

然后我们考虑容斥,设 f(S)=dSf(d),g(T)=dTg(d),换句话说,是其子集的 f,g 和,那么显然:

f(S)=dSf(d)×(1)|S||d|,g(T)=dTg(d)×(1)|T||d|

于是我们可以得到

Ans=S,T{1,...,n}(dSf(d)×(1)|S||d|)(dTg(d)×(1)|T||d|)

Ans=LR=ϕf(l)g(r)(2)n|L||R|

然后我们可以考虑 dp 这个东西,不妨设 F[i,j,k] 表示确定 1,...,i 中的点的 L,R 归属 & 在两个图中的父亲,L 中有 j 个,R 中以后有 k 个的方案数,初始化 F[1][1][i]=1,考虑转移,系数是左右部父亲钦定的贡献:

  • 放进 LF[i1][j][k]F[i][j+1][k],系数 j×k

  • 放进 RF[i1][j][k]F[i][j][k1],系数 j×k

  • 放进虚空:F[i1][j][k]F[i][j][k],系数 2×j×k

答案是 F[n1][j][k]×j×k


P2480

说句鲜花写这题的时候跟 nft 去楼梯间快乐吃了桶泡面 /kel

题目要求 gd|n(nd)mod999911659,这个指数很大。

考虑拓展欧拉定理,那么就是要求一个 Ans=d|n(nd)mod999911658,注意特判 Ans=0 时答案为 0 捏(

然后直接 exlucas 发现过不了,然后会发现这个东西的质因数指数都是 1,直接 lucas 就行了,注意逆元最开始全部预处理掉捏。


P5631

一个一眼的做法最大生成树做不了呜呜 /dk

观察到值域不大,考虑枚举不出现某个权值的边,那么就是线段树分治板子了。


P5278

没卡我平方哈希,直接哈希就好了。首先树状数组维护出区间平方和,取模可以使用自然溢出 >w<

线段树动态维护一个区间 rmq,这样子可以求出区间的正确范围是 [l,r],然后考虑怎么算和,这是个简单东西,直接展开就行了谢谢喵,里面的部分可以用公式算:

l2+(l+d)2+,...,+(l+(yx)d)2

=(yx+1)l2+d2i=1yxi2+2adi=1yxi


CF1282E

简单观察 + stl 练手题,写一大堆 stl 可能是我太菜了 /kk

每次考虑一个二度点的三角形删除即可,但是那个边缘怎么做呢,可以数一下边的出现次数,选合法的连边。但是我写的时候比较唐,写的是什么按时间没出现的加入,也可以过。


CF1175F

一眼 maxmin+rl=0,min=1,显然可以枚举 r,然后线段树维护区间最小值个数,但是这样子没有充分利用题目性质!(

我们可以从 1 开始向左拓展到 l,此时有一个 rmq 是 limit,判断区间 [l,l+limit1] 是否合法即可,可以哈希,这样子可以做掉 rmq 在 1 左边的情况,所以再反过来求一次即可,{1} 特判一下即可。

注意写随机数的异或哈希,稍微强一点,平方和 & 异或和 过不掉。。。。


P5307

经典小结论 xyz=xyz,然后设 f[i][j][d] 表示走到 (i,j)n1mul=d 的方案数,f[r][c][0] 即为所求。

不难发现 d 这一块实际上只有大概 2n 种,于是直接暴力 dp 即可。注意 unordered_map 常数巨大无法通过,需要手写映射关系,还有就是数组要写滚动。


CF79D/P3943

做了一天垃圾题终于碰到点正常东西了 /shui

题目等价于目标序列消成 0,然后区间异或不难想到差分,因为操作的前缀和是实际序列。然后就变成了每次可以同时取反 d[x],d[x+leni],至少多少次可以消成全 0 序列。

将任意取反操作的 x,x+leni 连边,那么同时取反 i,j 的次数显然就是 i,j 之间的最短路,考虑到实际 1 点数量不多,直接以每一个 1 为起点跑一次 bfs,这样子就有我们需要的代价了。

那么题目中的黑点一定可以是两两一起消除的,否则在图中成环,不优,现在变成了询问一个最小完美匹配、、、、

注意到数据范围并不大,我们可以考虑状压 dp,设 f[s] 表示选集合 s 的最小代价,由于差分数组可能导致 1 的数量在 d 中倍增,朴素的 O(2cc2) 无法通过此题,这里的 c 表示 d1 的个数。

于是我们优化转移少掉一个 ×c,对于集合 s,我们不需要枚举 i,j 的任何组成,i 只需要枚举一个即可,因为顺序不影响贡献,然后就做完了 qwq


CF1097D

一个想法是对于 d|nd 的贡献,然后我们发现概率跟 d 的质因数的指数有关,并且在游戏过程中每个质因数的变换独立,于是我们猜测可以分开做然后乘起来,但是算 d 的概率这个还是有点难做。

上面的质因数相对独立启发我们按照 n 分解质因数的形式 n=pixi 去做,换一种思路,那么我们先考虑一个 pd 的贡献。

f[i][j] 表示 pd 做了 i 次之后变成 pj 的概率,那么显然有 f[i][j]=jjf[i1][j]×1j+1 捏(

那么 pd 做游戏的期望就是 i=0dpi×f[k][i],然后考虑合并答案,发现这个东西确实可以直接乘起来 >w<


CF1182E

指数做加法,矩阵乘法优化即可。

posted @   Hypoxia571  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示