2023.12 ~ 只要梦还是「梦」的话
COCI 2023.11
LOJ3999
考虑把填数过程倒过来做,那么就变成了覆盖。
设 f(i,j,0/1)f(i,j,0/1) 表示目前填进去 ii 个数,且最后一个填的数是 jj,并且 jj 的位置在最左侧/最右侧的方案数。以 f(i,j,0)f(i,j,0) 为例,转移有:
- f(i,j,0)→f(i+1,k,0)f(i,j,0)→f(i+1,k,0),要求 k≤j−1k≤j−1 且 j−1≡k(mod2)j−1≡k(mod2)。
- f(i,j,0)→f(i+1,k,1)f(i,j,0)→f(i+1,k,1),要求 k≤j−ik≤j−i 且 j−i≡k(mod2)j−i≡k(mod2)。
前缀和优化即可,复杂度 O(n2)O(n2)。
LOJ4000
考虑建一个 DFS 树,那么非树边都是返祖边。
考虑 (u,v)(u,v) 这样一条非树边,这里 uu 是 vv 的祖先。在删掉 uu 和 vv 之后图长这样:
这里紫色部分和红色部分都可能不存在,但由于我们限定这是一条非树边因此绿色部分一定存在。uu 上面的部分也可能不存在,但稍后我们会看到这并不影响判断,
首先红色部分必须存在向上的连边否则就会和绿色部分分开。因此我们可以把红色部分和 uu 上面的部分看作一个整体。当 uu 为根节点的时候红色部分不存在,不过这不会影响我们的判断。
注意到绿色部分也是一个整体的连通块,紫色部分会构成若干连通块。那么紫色部分的每个子树要么和绿色部分有连边,要么和红色部分有连边(且红色部分存在)。我们分几类情况讨论:
- 存在一个紫色的子树和红绿均无连边:这个子树会被分割为独立的一个连通块,一定不合法。
- 存在一个紫色的子树同时和红绿均有连边(且红色部分存在):(在判掉上面那种情况的前提下)一定合法。
- 每个紫色的子树都只和红色或绿色中的一个连边:这时需要绿色部分和红色部分有连边,或者红色部分不存在。
考虑三种情况怎么判,发现只需要维护某个子树内最浅和最深的一条返祖边,可以用线段树合并或启发式合并求出。对于第三种情况,绿色部分可以写成 DFS 序上的 O(1)O(1) 个连续段,维护 DFS 序区间最小值即可。对于求出绿色部分顶端的点,发现本质上是树上 kk 级祖先。
接下来我们考虑树边怎么判。设 u=favu=fav,有以下情况:
- uu 是根节点:如果 uu 在 DFS 树上的儿子数量 ≥3≥3 一定无解,如果 uu 在 DFS 树上的儿子数量 =2=2 那么要求 vv 在删去 uu 之后是一个孤立点。如果 uu 在 DFS 树上的儿子只有 vv,那么这要求 vv 在 DFS 树上也只有一个儿子,或者 vv 是孤立点。
- uu 不是根节点:要求 uu 的除了 vv 的每个儿子都得有向上的连边,然后如果 vv 有儿子就必须连到 uu 的祖先上。
时间复杂度:O(mlogn)O(mlogn) 或 O(mlog2n)O(mlog2n)。
THUPC2023
H
w(i,j)=log2lowbit(i⊕j)w(i,j)=log2lowbit(i⊕j)
D
显然 10L10L 是一个合法解,于是答案不超过 10L10L,而 check 是容易的。
枚举答案,然后 O(10L×N)O(10L×N) 做完了。
A
考虑到附加边一共不会经过超过 kk 条,但这个是为啥来着不会证了啊
然后可以分 kk 个阶段做,每个阶段先对正常边跑 dij,然后需要做类似于 fx+apopcount(x⊕y)→fyfx+apopcount(x⊕y)→fy 这样的一个转移。这个考虑类似 fwt,依次考虑每一位,g(i,j,S)g(i,j,S) 表示这个数是 SS,考虑了前 ii 位,目前 popcount 已经有 jj 位不同,这种情况下 ff 的最小值。那么转移就是
最后用 minjg(k,j,S)+ajminjg(k,j,S)+aj 来更新 fjfj 就行了。
K
打表发现 SGi=iSGi=i
需要求
设 f(N)=∑Ni=1∑x+y<i,x≥0,y≥0[S⊕i⊕x⊕y=0]f(N)=∑Ni=1∑x+y<i,x≥0,y≥0[S⊕i⊕x⊕y=0] 那么上面就是 f(N)+f(M)−f(M−1)f(N)+f(M)−f(M−1)
考虑
从低位向高位 DP,f(i,j,k,l)f(i,j,k,l) 表示在第 ii 位,前面进位传过来一个 jj,k=0/1k=0/1 表示目前和 NN 的大小关系(>,=,<>,=,<),zz 是否有非零的位。
F
题目的约束相当于:对每个 1≤i,j≤n1≤i,j≤n,都有
发现 bb 的每一列是独立的。这里加法可以看作 xor。
依次考虑每一列,如果当前在第 pp 列,那么有以下方程组:
其中 i=1,2,⋯,ni=1,2,⋯,n。移项就可以得到一个右侧常数均为 00 的方程组,其系数矩阵形如
这里减法也是 xor。然后由于 aa 是随机的,可以证明这样的矩阵自由元很少。
(n−1)×n(n−1)×n 矩阵秩为 n−1−kn−1−k 的概率可以这样估计,考虑这些向量都在对应的空间中的概率为 12kn12kn,而这样的空间数量和零空间数量相同,后者可以用零空间的任意张成组来简单估计上界为 (2nk)(2nk),因此是 O(1k!)O(1k!) 级别的。
那么每一行解数很少,可以暴力处理出所有解。
还需要满足恰好有 kk 个 11,那么背包即可。使用 bitset 优化消元,复杂度 O(n4w)O(n4w)。
L
EC-Final 2021
B
首先算出 f(l,r)f(l,r) 表示 j≥i>r+1j≥i>r+1,且 s[i⋯j]=s[l⋯r]s[i⋯j]=s[l⋯r] 的 (i,j)(i,j) 个数。
这个可以 sam,依次考虑每个节点,算出来 endpos 然后考虑每个长度,然后双指针。
有了 ff 之后考虑枚举 s2+s3s2+s3 的左端点 pp,然后枚举 s1s1 的左端点 qq,可以发现这个首先需要满足一个 s[q⋯p−1]=s[p⋯2p−q−1]s[q⋯p−1]=s[p⋯2p−q−1],然后我们就可以给答案加上 ∑j≥2p−qf(p,j)∑j≥2p−qf(p,j)。维护 f(p,⋅)f(p,⋅) 的后缀和即可。复杂度 O(n2)O(n2),疑似可以继续优化
G
首先把能确定的位置 bfs 一遍都确定下来,然后如果还有空位,随便选一个填上接着 bfs。
D
显然答案不超过 22。
考虑 00 怎么判,发现需要判线段与线段相交。
考虑 11 怎么判,发现大概需要判一些半平面的交和并是否非空之类的。
被卡精度了牛魔酬宾
CCPC 2021 Guilin
A
答案是 2x−12x−1,注意开 long long
I
从大到小贪心
G
二分答案后判一下,需要特判 n=1n=1
E
发现不管怎样,第一次我们删所有 i<ji<j 的边 i→ji→j,第二次删 i>ji>j 的一定能删完。
于是 ans≤2ans≤2,发现 ans=1ans=1 当且仅当无环,ans=0ans=0 需要图中没边。于是只需要求有向图最小环。
J
可以先 SA 对每个 ii 求出长为 ii 的本质不同子串个数,然后就变成了查询长为 ii 的本质不同子串中字典序第 xx 小的一个。考虑离线,从大到小做,把 hi≥khi≥k 的位置 ii 连边 (i,i+1)(i,i+1),那么会形成若干连通块,我们需要支持查询第 kk 个连通块中 sa 的 min。来点 ds 维护下就行。
当然还要删掉长度不够的后缀。
F
考虑算小凸包的每条边被看到的概率,发现只需要求出这条边所在直线和大凸包的交点。
毛估估一下发现交点在大凸包上的位置有单调性,双指针即可。有一些细节。
沙伯出题人卡我精度,精神过题法,启动!
XXII Open Cup, Grand Prix of IMO
E
考虑如果存在 ii 使得 2∤degi2∤degi,那么这样的 ii 至少有两个,且一定是偶数个。称这样的 ii 为奇点。
考虑随机把点集划分为 S,TS,T,并考虑 S,TS,T 之间的边数。发现如果左侧分了奇数个奇点,那么右侧也肯定会分奇数个奇点。但如果删掉 S,TS,T 之间的边,那么左右两侧必须都要有偶数个奇点。
在删掉 S,TS,T 之间的边之后,SS 中会有一些偶点变成奇点(这意味着在它的邻边中删掉了奇数条边),也会有一些奇点变成偶点(也是删掉相邻的奇数条边),发现不管怎么变对中间的边的奇偶性影响都是 11。由于一开始有奇数个奇点,最后变成了偶数个奇点,因此总的奇偶性变化量一定是 11。
也就是说只要一侧分了奇数个奇点那么 S,TS,T 之间的边数就是奇数,那么只要存在奇点,随机一组 (S,T)(S,T) 使得中间边数是奇数的概率就是 1212。
考虑怎么算 S,TS,T 之间的边数,先算总边数再减掉 S,TS,T 各自的边数即可。这样可以先用 11 次询问得到总边数,然后再用 29×229×2 次询问 check 2929 次,这样错误率就是 12291229。
B
考虑 ⌊x/w⌋=1w(x−(xmodw))⌊x/w⌋=1w(x−(xmodw)),考虑维护 ∑x∑x 和 ∑(xmodw)∑(xmodw)。
用平衡树维护排序之后的序列,那么每次相当于单点插入和单点删除。
对于每个节点,维护其长度 LL,发现需要维护 ∑ikai∑ikai 以及 ∑(((imodw)kai)modw)∑(((imodw)kai)modw)。
对于第一个,维护 Sj=∑ijaiSj=∑ijai,那么合并的时候需要把右边的信息位移一下变成
于是可以 O(k2)O(k2) 合并。大概还需要预处理快速幂。对于第二种维护
那么答案就是 ∑x,y((xk×y)modw)×Tx,y∑x,y((xk×y)modw)×Tx,y。合并的时候需要在 xx 这一维上偏移一下。
总复杂度 O(n(k2+w2)logn)O(n(k2+w2)logn)。
H
先判掉 K=1,K=2K=1,K=2。首先 K≤20K≤20 的时候可以直接输出一个 KK 个点的环。
现在是找规律时间!下面为了方便我们把图改成 0-indexed。
- 在 n=20n=20 个点的环上加一条边 (0,2)(0,2),可以得到一个 ans=22ans=22 的解。
- 进一步再加 (2,4)(2,4),ansans 会 +1+1;依次类推,除了最后一个 (18,0)(18,0) 不会使 ansans 改变之外,其他的 (2i,(2i+2)modn)(2i,(2i+2)modn) 这些边都会使 ans+1ans+1。
- 现在我们可以得到 ans=30ans=30 的图,类似地添加 (2i,(2i+4)modn)(2i,(2i+4)modn),可以得到 ans=32,33,⋯,39,40,40ans=32,33,⋯,39,40,40 的图。
- 类似地添加 (2i,(2i+6)modn),(2i,(2i+8)modn)(2i,(2i+6)modn),(2i,(2i+8)modn) 就可以得到 ans≤60ans≤60 的图。
- 注意 21,31,41,5121,31,41,51 这四种情况上面构不出来,需要特殊处理。具体来说 ans=21ans=21 就直接令 n=19n=19 再加 (0,2)(0,2),其他的都是删掉上一个阶段的最后两条边再提前加入下一个阶段的一条边。
于是就做完了。
看了官方题解之后发现我做麻烦了orz
I
对每个 (i,j)(i,j),如果第 ii 个矩形和第 jj 个矩形有交我们就连边 (i,j)(i,j),那么要数的就是补图三元环个数。发现补图三元环个数不好数,设 x,yx,y 分别为原图三元环个数和补图三元环个数,一般地,有
现在只需要算 deg1⋯ndeg1⋯n 以及原图三元环个数。
考虑怎么算 degidegi:按照右边界排序,先钦定 ii 的右边界在 jj 的右边界的右侧,那么 xx 这一维上和 ii 相交的矩形 jj 形成一个区间,现在需要算这个区间内有多少个矩形在 yy 这一维上也相交。容斥,设 ii 的上下边界为 [s,t][s,t],用总数减去上边界 <s<s 和下边界 >t>t 的即可。发现是二维偏序,可以离线后树状数组或者直接主席树。
考虑怎么算三元环:先考虑一维的情形,考虑 V-E 容斥,钦定一个 ii 被三个都包含算一下方案数,再钦定 (i,i+1)(i,i+1) 同时被包含算一下方案数,这样恰好把每个计数一遍。那么二维就是两边分别做一下这东西,扫描线即可。需要线段树维护区间的 (ai3)(ai3) 以及 (ai2)(ai2) 之和,以及区间加。
总复杂度 O(nlogn)O(nlogn) 带巨大常数。
K
首先一个 3log2K3log2K 的方案:考虑当前方案数为 xx,加一个 00 可以 x←2xx←2x,然后考虑如果当前集合中《所有正数之和》与《所有负数之和的绝对值》中的较大值为 SS,那么我们考虑同时加入 S+1,−(S+1)S+1,−(S+1),可以令 x←x+1x←x+1。于是这样就不超过 3log2K3log2K。 但是过不去。
考虑随一个正整数集合 SS,设 x=max(S)x=max(S),我们加一些 ≤−x≤−x 的负数进去,那么加一个 xx 对方案数造成的贡献就是正数凑出来 SS 的方案数。做一个背包就行。
具体来说我们 DP 算出来 fifi 表示凑出来 ii 所需的最小个数,同时 gigi 表示 ii 的前驱,这样就能构造方案了。
如果随出来的 SS 不行就再凹两下,直到凹出来一个能覆盖 [1,106][1,106]。反正这些都可以预处理,所以凹多少次才出分都无所谓,硬凹就行了(
The 2nd Universal cup. Stage 13
B
显然 p,qp,q 之间是双射。考虑一位一位地确定 pp,如果现在在填 pipi,那么相当于我们在 qq 里面的一些位置填入了 1,2,⋯,i1,2,⋯,i 这些数,然后问能够让 qq 满足他那个条件的方案数。由于填入的是最小的 ii 个,所以后面再填都只会更大,所以算出来每段方案数然后合并一下就行了。复杂度大概是 O(n3)O(n3)。
官方题解怎么是 O(n5)O(n5) 啊?我能做 1e6 啊。
M
首先发现 s→ts→t 等价于 0→(s⊕t)0→(s⊕t)。考虑 00 开始的一条路径。
发现很有规律,大概是有这样的循环:
00
01
11
10
00
打表发现终点是 00 的答案是 43(4k−1−1)43(4k−1−1)
预处理一下步数之类的东西,然后大概在一个类似 trie 的东西上走一趟就行了
2023.12.11
A
首先可以发现一些事实:如果染色的过程形成了连续段,那么连续段长度都得一样,而且连续段之间的间隔也得是连续段长度的倍数。设 f(h,n)f(h,n) 表示连续段长度 >1>1 的答案,g(n,k)g(n,k) 表示连续段长度 =1=1 的答案,就有
然后:
- 通过找规律发现 g(h,n)=f(h,h/n)g(h,n)=f(h,h/n),有了这个结论之后就有
边界是 h(⋅,1)=1h(⋅,1)=1。这个时候暴力递推就可以过了。
然后也可以优化,具体就是对每次除掉的 k1,k2k1,k2 计数,二项式反演之后多点求值就可以 O(Nlog2N)O(Nlog2N) 其中 NN 是 hh 的所有质因子次幂和。可以不用多点求值做 O(N√N)O(N√N),但是还是要 fft。这部分比较 trivial。。。
然后我们来证一下 g(h,n)=f(h,h/n)g(h,n)=f(h,h/n),大概是说把 dd 看成一个 P(x)=∑xpiP(x)=∑xpi 这样的一个多项式,其中 pi=∑j<idj,i=1,2,⋯,npi=∑j<idj,i=1,2,⋯,n,然后相当于是得存在一个 Q(x)=∑xqiQ(x)=∑xqi 使得 P(x)Q(x)=∑h−1i=0xiP(x)Q(x)=∑h−1i=0xi,然后我们把对 PP 计数改成对 QQ 计数,发现 QQ 刚好就是所有连续段长度 >1>1 的情况。
B
考虑 rprmq1 的做法:对一维建线段树之后,矩形 max 就变成了 O(logn)O(logn) 个顶着左边界的矩形 querymax,对于这种可以直接考虑扫描线,线段树维护区间历史最大值。这个是 ez 的。
那现在他其实是相当于把一维强制在线了,不过我们可以二进制分组,维护每一组结束到当前时刻的线段树,以及这一组内部的 query 区间到这一组的结束时间这段矩形的 max。每次就在每个组的线段树上暴力修改一下。那么还有合并两个组的操作,这个就直接暴力更新一下 mx,然后清空掉前面那个组的线段树就行。清空也得维护一个标记,非常的抽象
还有一个做法是说在线段树每个节点上维护一个单调栈,考虑一次查询其实是说要查询 O(logn)O(logn) 个节点的单调栈上面,时间 ≥t≥t 的一个历史最大值。然后我们的操作可能会合并出来 (add,maxadd)
这样的标记,合并到单调栈上就是把当前的 mx+maxaddmx+maxadd 再插入单调栈。然后插入守望者就是在这 O(logn)O(logn) 个节点里面各自插入一个。
C
LuoguP6816
写了 10k 代码,这题真不好评价。。
2023.12.12
A
Luogu9084
大概来说,先考虑怎么算答案,发现建出笛卡尔树之后是简单的;再对着这个 DP 即可。
需要设 f(i,j),g(i,j)f(i,j),g(i,j) 表示 ii 个数的排列 ans=jans=j 的方案数,其中 ff 认为排列最左侧有一个 n+1n+1 也就是无论如何都会删去最左侧的数,gg 认为左右两侧都有一个 n+1n+1。最后算答案把 ff 合并起来即可。
每次至少删掉一半的数,因此 m=O(logn)m=O(logn),将转移用前缀和优化可得复杂度为 O(n2logn)O(n2logn)。
B
Luogu3581
考虑从小往大插入每个数,那么任意时刻不能出现两个数的差 >L>L。
维护当前 n−L+1,n−L+2,⋯,nn−L+1,n−L+2,⋯,n 的相对顺序以及是否相邻即可。
对于本题,L=3L=3,因此有 3!+(32)×2!=123!+(32)×2!=12 种状态,实际上可以发现如果只剩两个数那么必然含有 nn,因此实际的状态数为 1010。
C
树上邻域数颜色。
做法:考虑直接上点分树,发现直接做邻域数点会算重。对每种颜色 cc 建出虚树,然后类似 BZOJ 世界树,对每个点 xx 可以算出所有的 vv 满足 vv 和颜色为 cc 的点中距离最小的一个点恰好是 xx 的这样的所有 vv,我们用 xx 去支配这些 vv,算的时候只能算 xx 的贡献。这样的 vv 在 DFS 序上会形成 O(1)O(1) 段区间。
这里虚树上可能有一些点是新加进来的没有颜色,我们算出这个点到最近的一个有颜色的点的距离 dd,然后把这个点造成贡献的条件 +d+d。
然后就变成简单的数点了,把询问挂在点分树上,对每个点单独算一下就行了大概。
复杂度是 O(nlog2n)O(nlog2n)。
CF1856E2
什么玩意这都。
不难发现每个点独立,而且一个点如果钦定了它的值是 xx 那么肯定一个子树要么全 <x<x 要么全 >x>x,这个用调整法容易证明。那现在就是要对每个点求出他的儿子的一个子集使得它们的 size 之和尽可能接近总 size 的一半。这个问题是比较难的,而且我们还要做 nn 遍这个问题,非常的难绷
首先这个问题有一些经典做法:由于总 size 之和 =O(n)=O(n) 因此种类数只有 O(√n)O(√n),做多重背包可以做到 O(n√n)O(n√n),但其实二进制分组然后 bitset 优化,复杂度是更好的 O(n√nw)O(n√nw) 不带 log。还有一种做法是分治 ntt,这样是 O(nlog2n)O(nlog2n)。
然后我们注意到如果一个点的重儿子大小超过了一半那就不需要做了,设我们解决这个问题的复杂度是 O(f(n))O(f(n)),那么可以有一个 T(n)=T(n/2)+O(f(n))T(n)=T(n/2)+O(f(n)) 的递归式。
上面三种分别对应 O(n√n),O(n√nw),O(nlog3n)O(n√n),O(n√nw),O(nlog3n)。其中最快的是 O(n√nw)O(n√nw)。
LOJ3276
2023.12.14
A
注意到 k≤5k≤5 那么 Ai≥11Ai≥11 的地方都没有用,只需要考虑 Ai≤10Ai≤10。
f(i,j,S)f(i,j,S) 表示考虑前 ii 个点,选了 jj 个区间覆盖掉,目前选的区间集合是 SS 的最大收益。
粗略估计发现状态数居然是 O(nk(2kk))O(nk(2kk)),转移还带一个 (2kk)(2kk),但是常数贼小,测了个极限才 1.5s
怎么没过???司马了
考虑优化转移,发现区间没有本质区别,所以一定优先砍更长的,转移就可以 O(k)O(k) 了。乱过
其实发现这个事情之后不如直接爆搜所有状态,发现每个位置的状态就非常少,于是可以跑的更快。
B
无解当且仅当存在一个连通块的每个点度数都是偶数,或者存在一个连通块是团。
然后随机操作,如果操作完还有解就贪心地进行下去。有正经做法,闲的时候想一下
C
首先考虑建一个超级源点向所有源点连一条边,费用为 00,这样就转化为只有一个源点的情况。
设源点为 ss,取以 ss 为根的一颗 DFS 树,那么如果确定了非树边的流量,树边的流量可以自底向上递推出来。设 f(u,v)f(u,v) 表示 u→vu→v 的流量,我们约定 f(u,v)=−f(v,u)f(u,v)=−f(v,u),那么对于点 xx 和它的父亲 yy,设 R(x)R(x) 为 xx 的所有前向边的集合,son(x)son(x) 是 xx 的儿子集合,那么需要有
这样就可以解出来 f(y,x)f(y,x) 的值然后递推上去。那现在我们只需要考虑非树边的流量。
考虑算出每条树边里面含有的非树边的系数,然后整体平方,这样会得到一个二次型 xTQxxTQx,其中 x,Qx,Q 分别是变量和系数矩阵。但我们注意到实际上没有任何的约束,考虑选一个 xixi 为主元,那么就是有 Ax2i+Bxi+CAx2i+Bxi+C 的形式,这个最小值当然应该在 xi=−B2Axi=−B2A 也就是 2Axi+B=02Axi+B=0 的时候取到。
进一步发现由于原本是二次型所以 AA 一定是常数,BB 是关于其他变量的一个式子,于是这个就可以写出一个线性的方程。实际上我们具体地写一下这个式子就是
然后我们来严(min)谨(ke)地考虑一些东西,比如说这个最值会不会不存在,或者只看上面的方程是否会有多解等等。首先回到原问题就可以说明最优解存在,然后考虑到二次函数的极值点其实是唯一的,所以总体的最优解肯定也是唯一的。于是现在解这些方程就可以得到一个 O(m3)O(m3) 的做法。
这里当 ci=0ci=0 的时候可能会有一些位置退化为一次函数,但你再想一想发现如果有一个 xixi 的二次项退化成了 00,那么包含这个 xixi 的所有树边的 cc 都得是 00 这意味着它的一次项也一定全是 00。所以最优解仍然存在,只不过这个时候变成了可以任取这个 xixi,即存在自由元。
那 O(m3)O(m3) 过不去怎么办嘛,这里有一个很神秘的东西就是,考虑一个环,在环上同时添加一些流量之后图仍然合法。写出这些边在最优情况下的流量 fifi,如果同时加 xx 就会变成
要想让这个式子在 x=0x=0 处取最值,意味着 ∑cifi=0∑cifi=0,也就是说每个环的 ∑cifi∑cifi 需要是 00。
这样一来我们设新的变量 yi=cixiyi=cixi(这可能会导致某些 yiyi 需要恒 =0=0),那么上面的式子同样可以对 yiyi 写出。由于一个环的和为 00,我们就可以给每个点 uu 赋上一个类似电势的东西 φuφu,然后定义一条边的 ff 就是两点之间的电势差即 yu,v=φu−φvyu,v=φu−φv。这样就只有 nn 个变量了。
这里凭空冒出来一堆约束感觉好神秘啊,但实际上对上面那个 QQ 的二次型取到最值的方程做一些变换就可以得到后面这些凭空冒出来的式子了哈哈!
这样对着这 nn 个变量消元就是 O(n3)O(n3) 了。
列一下这个式子会发现 φφ 真的很有电势的感觉,cc 就是电阻,ff 就是电流,要求的就是每个点向外要有一个电流!!太神秘了啊啊
这样说这个题可以加强到 n,m≤5×105,m−n≤200n,m≤5×105,m−n≤200 的,但是这算加强吗。。一开始我们的做法就是 O((m−n)3)O((m−n)3) 的,可以直接过的其实。我加强本意是想用广义串并联
不过这个题就可以套到《UOJ 比特之地》那样的图上面去了
2023.12.15
A
对于区间 [l,r][l,r],如果 [l+1,r],[l,r−1][l+1,r],[l,r−1] 的 mex 都严格 <mex(al,al+1,⋯,ar)<mex(al,al+1,⋯,ar),那么这个区间才会有用。有一万种方法分析出来,有用的区间个数为 O(n)O(n)。参考:《NFLS-NOI2023 模拟赛 - mix》
然后就随便做做。
怎么被卡常了???又司马了
这里除了 set 颜色段均摊求区间,还可以用线段树二分但是好像常数差不多。
为了卡常还需要用树状数组来维护区间加区间历史和。具体来说,考虑如果我们在 t1t1 时刻做了一次区间加 xx,然后在后面的 t2t2 时刻进行了查询,那么就相当于造成 (t2−t1)x(t2−t1)x 的贡献。于是维护当前时间 TT,维护两个树状数组支持区间加区间求和,然后每次更新历史和看作 T←T+1T←T+1,区间加 xx 看作给第一个树状数组区间加 −Tx−Tx,第二个树状数组区间加 xx。
查询区间历史和就是 T×sum2(l,r)+sum1(l,r)T×sum2(l,r)+sum1(l,r)。区间加区间求和还需要两个树状数组,那么总共是四个树状数组。
B
发现 11 被换走之后事情就和 11 没关系了,考虑倒序操作,发现一定是 ii 选择 i+1,⋯,ni+1,⋯,n 中和 ii 距离最远的一个点 xx,然后先构造出来 i+1⋯ni+1⋯n 的解,再交换 pi,pxpi,px。维护直径就很容易求出答案。
考虑字典序最小,发现只需要正着考虑,维护每个点 ii 实际会被换到的位置 qiqi,每次从后面距离最大的点里面选出 qq 最小的一个 qjqj,然后令 pi←qj,qj←ipi←qj,qj←i 即可。线段树维护区间直径,O(nlogn)O(nlogn)。
C
首先把 (1,1)(1,1) 不能到达或者无法到达 (n,m)(n,m) 的点删掉,如果有 cntcnt 个就把方案数乘上 2cnt2cnt。
然后把这个东西看成左下到右上的一条路径,联通定义为八连通,然后需要把左下和右上通过某些障碍连起来。其中每个极大的障碍连通块可以看作它周围一圈点,左下方的是终点,右上方是起点,在空地之间走的时候只能往右上走。建图拓扑排序后 DP 即可。代码先摆。
USACO23DEC G
这是来搞笑的????。。。。。。。。
A
考虑从后往前构造即可
B
先算出每个点的最长路 fufu,然后只保留 fv+w=fufv+w=fu 的边 (u,v,w)(u,v,w)。
现在要对每个点找字典序最大的路径,这个考虑每个点维护个主席树,然后维护哈希值,比较字典序就在主席树上二分。
C
考虑 y=p→y=p+1y=p→y=p+1 的增量,设 ≤p≤p 的 xixi 有 cc 个那么就是 ac−b(n−c)ac−b(n−c)。
令 ac−b(n−c)>0ac−b(n−c)>0 得 c>⌊bn/(a+b)⌋c>⌊bn/(a+b)⌋。
把 xx 排序之后,最优解一定是取 y=x⌊bn/(a+b)⌋+1y=x⌊bn/(a+b)⌋+1。答案就随便算算。
2023.12.18
A
竞赛图三元环数量是 (n3)−∑(degi2)(n3)−∑(degi2)。这里 degidegi 表示 ii 的出度。
考虑怎么算 degidegi,先考虑让 aj<aiaj<ai,维护当前的集合 SS,那么就是
于是可以对每个 vv 预处理 ∑e∣vμ(e)[hv/d=1]∑e∣vμ(e)[hv/d=1],同时维护 fdfd 表示 SS 中 dd 的倍数个数即可。
aj>aiaj>ai 同理,总复杂度 O(mlogm)O(mlogm)。现在考虑怎么构造一组解。
把度数从大到小排序,任取两个 i,ji,j 满足 degi≥degjdegi≥degj,且 j→ij→i 有连边,那么 jj 除了 j→ij→i 这条边之外至多只有 degj−1degj−1 条出边,因此 ii 连出去的那些点里面一定有一个是 jj 没有的,设其为 xx,我们就找到了 i,x,ji,x,j 这个三元环。
还需要说明如果存在三元环一定存在这样的边。发现如果不存在这样的边,那么说明按 degdeg 排序之后都是前面连向后面,那么这就是一个 DAG,因此不存在三元环。考虑怎么找到这样的一条边,先按 degdeg 排序,找到最大的一个存在后面向他连边的点就行了。
这部分需要进行 O(n)O(n) 次 check,总的时间复杂度是 O((n+m)logm)O((n+m)logm)。
B
有一个 O(N4)O(N4) 的做法:把排列容斥掉,然后枚举剩下的集合的大小,并在 DP 的过程中来确定 SS。设 f(i,j,k)f(i,j,k) 表示考虑了 ii 个数,目前 SS 在 1⋯i1⋯i 中已经钦定了 jj 个数,且 pipi 取的是 SS 中的第 kk 大的数,的方案数。那么 pi=ipi=i 当且仅当 j=kj=k,pi,pi+1pi,pi+1 的大小关系也容易计算。
使用前缀和优化,时间复杂度为 O(N4)O(N4)。这是原来的官方题解,但是我们考虑使用恐怖 zky 优化:
O(N3)O(N3) 做法:首先还是套 LOJ 不等关系,把符号全都容斥成大于号。简单计算可得,一个 >
被钦定为 >
的贡献是 (A−1)(A−1),不被钦定的贡献是 11。<
被钦定为 >
的贡献是 (1−A)(1−A),不被钦定的贡献是 AA。那么排列被划分成若干下降段,每一段至多有一个 pi=ipi=i 的位置。这个位置将这一段分成两个小段,我们考虑 DP 的时候在这两个小段的交界处计算 pi=ipi=i 的贡献。
具体来说我们的分段方式是找到最后一个 pi≥ipi≥i 的位置,然后从这个位置分开。DP 的时候我们是考虑所有的分段方式,对每种方式来计算方案数。
不把排列容斥掉就 DP 的坏处在于,不管是 AT_dp_t 还是 LOJ 不等关系,其在转移的时候都会对前面已确定的进行改动(前者会对某些数 +1+1,后者则相当于选择后进行了归并)。
这里我们考虑一种新的排列 DP 方式:DP 的过程中对每个 ii,直接对其填 1⋯n1⋯n 中的一个数。我们分 pi≤ipi≤i 和 pi>ipi>i 考虑,对于 pi≤ipi≤i,它的影响只会影响到前面,因此不具有后效性可以直接填入;对于 pi>ipi>i,我们暂时空出这个位置,并在后面填上这个位置。在 DP 的过程中同时记录 jj 表示前面目前空出了 jj 个位置,然后在 ii 这里可以选择空出当前位置,或者选择 jj 个位置中的一个位置 xx 填入 ii,然后把 ii 这里填 xx。
这样可能会没办法钦定相邻元素的大小关系,那我们就直接不管,而是在钦定段长的时候除掉一个阶乘。具体来说我们在 DP 前半段的时候,除了最后一个元素,只允许做空出当前位置的转移也就是 j→j+1j→j+1 的转移(因为要求 pi≥ipi≥i)。对于最后一个元素讨论一下 pipi 是否 =i=i 并乘上相应的系数。对于后半段,由于要求了 pi<ipi<i,我们只能做让 j→j−1j→j−1 的转移。在做这种转移的时候需要乘上 jj 的系数。
2023.12.19
A
场切了
感觉这个题非常对脑电波。。
考虑相当于新图里面每个点是原图的一个点对 (x,y)(x,y),然后每次可以选 xx 或者 yy 在树上移动一步。
那么考虑两个点 (x1,y1),(x2,y2)(x1,y1),(x2,y2),发现这两点之间的最短路个数就是
其中 dis(i,j)dis(i,j) 表示 i,ji,j 在树上的距离。那么当且仅当 x1=x2x1=x2 或 y1=y2y1=y2 时这个是 11。
于是任取一个点开始 BFS 算出他到每个点的最短路个数,=1=1 的就和他同行同列。再任取和他同行或者同列的一个点,把两个算出来的集合取交即可。
常数更小的写法:直接钦定一个二度点(由于新图 (x,y)(x,y) 的度数是 degx+degydegx+degy 且原树一定有叶子所以肯定存在,这里 degxdegx 表示 xx 在原树上的度数),那么它的两个相邻点肯定不会同行或者同列,随便选一个 DFS 下去,只走第一次 BFS 时确定的最短路个数 =1=1 的点,就可以直接确定一整行。
这样就只需要一遍 BFS 而不是两遍,场上写的两遍 BFS T 飞了/zk
B
场切了
首先考虑差分,那么把 [l,r][l,r] 区间 +1+1 就是把 r+1r+1 处的一个 11 挪到 ll 这个地方,−1−1 就是 l→r+1l→r+1。
于是建图,把正负分开,那么每个正数点需要把自己的正权值全都挪到负数那边去。
发现相当于二分图多重匹配存在完美匹配,考虑 Hall 定理,由于左部点集合 SS 对面的点集 N(S)N(S) 也一定是一个前缀+后缀的形式,考虑直接钦定右边的前缀+后缀,把能选的左部点都选上,这个时候一定是限制最严的。
钦定前缀和后缀仍然有 O(n2)O(n2) 种可能,但我们考虑只钦定前缀 1⋯i1⋯i,线段树维护如果选 j⋯nj⋯n 为后缀时右部点的点权和减去左部点点权和的值。那么只需要支持区间加,全局 max。
然后有一个细节是你需要提前算出来每个点能到的最长前缀和最长后缀,这个可以前后缀优化建图+缩点后 DP,但其实你可以直接 fi,gifi,gi 表示 1⋯i1⋯i 和 i⋯ni⋯n 能到的最长前后缀,然后 f,gf,g 相互转移。注意判一下如果成环就不管这个转移,显然这样是最优的。
时间复杂度 O(nlogn)O(nlogn)。我的代码写的真的是太漂亮了哈哈,一定要放出来鉴赏一下。
https://www.luogu.com.cn/paste/2m301073
C
有一个 O(n3)O(n3) 的 DP:fi,j,kfi,j,k 表示 ii 个元素的排列,选了 jj 个数,形成了 kk 个连续段的方案数。每次我们插入最小的元素,也就是原本 1⋯i1⋯i 变成 2⋯i+12⋯i+1 再插入 11,那么不选的话贡献就随便算下,选的话必须和至少一个已经选的相邻(否则一定联通不了),那么也容易算出系数。
这个 DP 没什么前途啊啊
考虑建笛卡尔树,找到 uu 的左右儿子 x,yx,y,发现需要 xx 一直往右儿子走,yy 一直往左走,只有这两条链上的点是和 uu 直接相连的。考虑
考虑啥?原神启动
2023.12.20
A
场切了
容斥一下就做完了啊啊
不容斥也是随便做啊啊啊,fi,jfi,j 表示当前在第 ii 个位置,最靠后的一个 aj=ayaj=ay 出现在 jj 这个位置。
B
场切了
随便做一下就 O(n√nlogT)O(n√nlogT) 做完了啊啊
但是有恐怖 zky 优化:
首先考虑找到直径的中点,如果直径上有偶数个点那么中点是一条边。这样整张图会被划分成几部分,去掉不是直径端点的点,每次一定是从某一部分中的一个叶子走到其它部分的任意叶子。
于是可以写出 DP,fi,jfi,j 表示 ii 时刻在 jj 部分内的方案数,转移随便写一下。
注意到对于叶子个数相同的部分,其转移是一样的,因此可以合并到一起转移。这样就只有 O(√n)O(√n) 个状态,于是矩阵快速幂优化即可做到 O(n√nlogT)O(n√nlogT)。
注意到如果直接转移是可以前缀和优化的,因此我们 O(n)O(n) 求出前 O(√n)O(√n) 项,然后跑 BM 即可 O(n)O(n) 解出最短线性递推式,再套一个多项式就可以 O(√nlogT)O(√nlogT) 算出第 TT 项。
这样就做到了 O(n+√nlogT)O(n+√nlogT)。
BM 解行向量 v1,v2,⋯v1,v2,⋯ 的最短线性递推式:在 modpmodp 意义下随机取列向量 pp,然后用 BM 计算标量 v1p,v2p,⋯v1p,v2p,⋯ 的最短线性递推式。
如果有 nn 维,算对的概率是 1−np1−np。(由 Schwartz-Zippel 引理)
C
Luogu6845
考虑按 DFS 序建线段树,每个节点维护区间直径。
那么如果修改的边是 (x,y)(x,y),其中 xx 是 yy 的父亲,设 yy 子树内 DFS 序最小值和最大值分别为 l,rl,r,那么影响到的线段树节点就是所有和 [l,r][l,r] 有交且不被 [l,r][l,r] 包含的区间。
由线段树的性质可知这样的区间只有 O(logn)O(logn) 个,暴力重新计算这些区间的信息即可。
由于 pushup 的时候需要查询链上和,所以复杂度是 O(nlog2n)O(nlog2n)。
UOJ388
给定一颗 nn 个点的树,每条边有边权。定义两个点 i,ji,j 配对的代价为 i,ji,j 之间唯一路径上的边权和。
定义一个区间 [l,r][l,r] 的权值为将 l,l+1,⋯,rl,l+1,⋯,r 两两配对的最小代价和。
求所有区间的权值之和,答案对 232232 取模。1≤n≤2×105,0≤wi<2321≤n≤2×105,0≤wi<232。
考虑一个点集怎么算答案。发现如果两条路径 x1→y1,x2→y2x1→y1,x2→y2 在一条边上相交,那么我们把路径改成 x1→x2,y1→y2x1→x2,y1→y2 一定更优。因此最优情况下,每条边只会被算 00 次或 11 次。
进一步考虑每条边什么时候会被算 11 次,发现这当且仅当断掉这条边后左右两侧存在一个连通块内部有奇数个点。首先必要性是显然的,现在考虑充分性。发现只需要自底向上构造,如果当前子树内有奇数个点就先把若干儿子两两配对,再把自己传到上面配对;否则就让自己和一个儿子配对。这样构造出来的方案一定满足边不相交,且只有断开后形成奇数大小连通块的边会被算入贡献。
现在考虑对每条边算贡献,设其为 (u,v)(u,v),其中 vv 是 uu 的父亲。发现这条边对一个区间 [l,r][l,r] 造成贡献,当且仅当 uu 的子树内编号在 [l,r][l,r] 内的点有奇数个。线段树合并或启发式合并维护即可。
时间复杂度为 O(nlogn)O(nlogn) 或 O(nlog2n)O(nlog2n),两种算法都可以轻松通过。
2023.12.22
A
直接选 deg 最大的点,答案是 2×(n−1−deg)+1×deg2×(n−1−deg)+1×deg。
C
建 sam 随便做一下,区间 checkmax 和区间对公差为 1 的等差数列 checkmax,桶排+并查集做到线性
B
任取 DFS 树,设 s(i)s(i) 为 1→i1→i 路径上的边权 xor 和,环可以 xor 出来的异或值构成集合 SS。
显然 kk 次操作肯定全都用完,相当于我们要选出 kk 个点 p1,p2,⋯,pkp1,p2,⋯,pk,那么最终的值是
其中 xi∈Sxi∈S 是一个环的 xor 和,p0=a,pk+1=bp0=a,pk+1=b。这里 a,ba,b 是起点和终点。
改写一下,把 (2k(s(a)⊕x0))⊕s(b)(2k(s(a)⊕x0))⊕s(b) 拿出来就变成
考虑从高往低做数位 DP,由于只有最后 O(logV)O(logV) 位会受到影响,考虑设 f(i,j)=0/1f(i,j)=0/1 当前 DP 到第 ii 个,钦定前面必须都取到最大值,这种情况下最后的 O(logV)O(logV) 位能不能 =j=j。
转移考虑把 xx 的部分和 pp 的部分分开,直接预处理所有可行的 xx。
考虑 pp,发现是 f(i,j)→f(i+1,(2j)⊕(2s(pi)⊕s(pi)))f(i,j)→f(i+1,(2j)⊕(2s(pi)⊕s(pi))),其中如果有最高位为 11 的 f(i,j)f(i,j) 不为 00,那么我们就只能转移最高位是 11 的,否则就是转移最高位为 00 的。那么这里就可以直接做一个 FWT;同理 xx 那边也是做一个 FWT。这样可以做到 O(qkVlogV)O(qkVlogV)。
加上恐怖 zky 优化可以得到 O(qV(k+logV))O(qV(k+logV)),大概是直接讨论每次 FWT 数组的变化,于是只需要在开头和结尾做 O(1)O(1) 次 FWT 和 IFWT。
Luogu - T306149
考虑对每个 ii,如果它被钦定为配对的前一项认为其贡献为 ii,否则贡献为 −i−i。
朴素的想法是 fi,jfi,j 表示当前在 ii,前面有 jj 个还没配对。但是这样没法让配对的元素不同。
发现如果有两个颜色在前面都留下来了那么为什么我们不把它们直接匹配呢,这样显然不会更劣。发现如果强行匹配可能会导致无解,比如 1 2 3 4 4 4
就得把前面的 1 2 3
都留下来。
我们发现这种情况最多只会留一个颜色,因为如果有两个颜色都需要前面留下一些数来配对那么这两个数自己就可以消。
fi,j,k,gi,j,kfi,j,k,gi,j,k 分别表示前 ii 个,钦定留下 jj 个 kk 或者 jj 个不是 kk 的元素。
注意 j≤cntkj≤cntk,因此总状态数为 O(n2)O(n2)。时间复杂度也容易做到 O(n2)O(n2)。
2023.12.23
A
考虑一维的情况,建笛卡尔树,那么放下来一个海绵之后这个点到根的一条路径上都会被搬空。
相当于每个点有一个权值,也就是他的区间长度乘上高度的范围,然后需要依次选 kk 条到根的链,然后把这条链上的点权清零,问最多删多少权值。这个就是直接长链剖分之后选前 kk 大的长链。
考虑二维,类似地我们建一个 kruskal 重构树,然后把每个点的权值设置为子树 size 乘上它的高度范围,那么就一模一样了。
B
首先可以发现最优解中任意连续的三段长度之和必须 >m>m,否则就可以合并成一段。
因此最优解划分出的段数是 O(n/m)O(n/m) 级别的,考虑怎么根据这个算答案。
考虑贪心,每次尽可能往远处跳,但可能会跳到一个不合法的位置。考虑对 m=n,n−1,⋯,1m=n,n−1,⋯,1 倒着处理,维护每个位置 ii 前面第一个目前还有可能合法的位置,然后每次跳到最远的一个距离 ≤m≤m 的,奇偶性不同的合法位置,再尝试往后跳。如果发现已经不存在合法位置了,就把当前位置标记成不合法。
这样每个位置只会被标记一次,因此总的次数是合法跳的次数加上标记次数,就是 O(nlogn)O(nlogn)。
C
我们直接来确定性做法好吧
依次确定每个 i=1,2,⋯,ni=1,2,⋯,n 需要填多少个,那么当前每个 ll 合法的 rr 都是一段区间。
每次二分一下,发现相当于要做 O(cnti)O(cnti) 次给一个 [L,R][L,R] 的当前合法区间对一段区间取交。
可以发现合法区间的 l,rl,r 都是单调递增的,因此只需要区间覆盖。这里有两个问题:
- 如果一个 ll 的区间 sti,edisti,edi 出现了 sti>edi+1sti>edi+1,可能会造成负数的贡献
解决方法是,对区间 [l,r][l,r] 的右端点进行 cmin(x)cmin(x) 的时候,同时对左端点 cmin(x+1)cmin(x+1);另一边同理。
- 如果二分之后发现不行需要撤销
我们考虑假装去操作,算出来如果进行这次操作会有多少贡献。同理由于 l,rl,r 单调,因此只需要线段树二分一下。
复杂度 O(nlog2n)O(nlog2n)。
The 2nd Universal Cup Stage.15
D
注意到如果选中了至少两个点,那么任意一个点只保留红边或者蓝边后度数都不可能是 33,否则就会有孤立点。
因此红蓝各自都需要是链或环。如果是链,那么长度不能超过 44;进一步讨论发现不可能是环。
那么我们首先删除图中所有有三个相邻红或蓝边的点,现在只保留红边,会形成若干链或环。枚举起始点后可能的方案数就只剩下 O(n)O(n),依次判断即可。
2023.12.27
from NFLS 模拟赛
给定一个有正有负的序列 aa,qq 次查询从 [l,r][l,r] 中选出 kk 段不相交的子段,使得其总和最大。
1≤n,q≤2×105,1≤k≤r−l+11≤n,q≤2×105,1≤k≤r−l+1。
考虑先 wqs,每个节点记录 fifi 表示选 ii 个不相交子段的最大和,设二分的斜率为 pp,就是要找一个 fi−i×pfi−i×p 最大的 ii。线段树每个节点维护 (i,fi)(i,fi) 的凸包(其实 ff 自己就是凸的所以没什么凸包之说),查询在 O(logn)O(logn) 个凸包上二分最后合并,这样得到了一个 3log 做法。
然后有很多方法降低到 2log,比如猫树,或者整体二分。我们考虑整体二分斜率,然后线段树每个节点维护指针,在分治树上 BFS,这样指针移动总次数为 O(nlog2n)O(nlog2n),总的复杂度是 O((n+q)log2n)O((n+q)log2n)。
from hdu2023
- O(nlogp+p0.75√logp)O(nlogp+p0.75√logp) 计算 nn 个数在 modpmodp 意义下的离散对数。
考虑用 BSGS 配合线性筛在 O(√p×π(√p))O(√p×π(√p)) 的时间内预处理 ≤√p+1≤√p+1 的所有数的离散对数,取 q=⌊√p⌋q=⌊√p⌋,然后对于一个 x≥qx≥q,我们做带余除法 p÷xp÷x,即 p=vx+rp=vx+r,其中 0≤r<x0≤r<x,那么有 vx≡−r(modp)vx≡−r(modp),即
另一方面有 p=(v+1)x+r−xp=(v+1)x+r−x,那么有 (v+1)x≡x−r(modp)(v+1)x≡x−r(modp),因此
由于 x≥√px≥√p,因此 v≤√pv≤√p,那么 v+1≤√p+1v+1≤√p+1,从而不管 logvlogv 还是 log(v+1)log(v+1) 都可以查表得到,因此我们就将问题转化为计算 logrlogr 或 log(x−r)log(x−r)。由于 min(r,x−r)≤12xmin(r,x−r)≤12x,因此 O(logx)O(logx) 次就可以缩减到 ≤√p+1≤√p+1 的规模,此时查表即可。这样就可以 O(p0.75√logp)O(p0.75√logp) 预处理,O(logx)O(logx) 查询一个 xx 的离散对数。
P9999
先考虑怎么算每个点经过 [1,n][1,n] 的答案。
对树做轻重链剖分,每一条重链维护一棵平衡树,里面存当前会跳到这条重链上的点的编号,以及每个位置的深度。先考虑往上跳,发现每个点只会跳过 O(logn)O(logn) 条轻边,跳过轻边的时候我们暴力从上一个平衡树里删除,在下一个平衡树内插入即可;对于没有跳过轻边的就打一个深度 +1+1 的 tag。
这里需要我们高效找到所有会发生轻重边切换的重链,考虑每条重链 ii 维护 timitimi 表示 ii 还需要多长时间会切换轻重边,那么每次暴力重构 O(logn)O(logn) 个 time,其他的都是 tim←tim−1tim←tim−1,直接维护就行。
然后考虑往下跳,发现同样只有 O(logn)O(logn) 次重链交换。同理在平衡树上二分出来节点位置,然后插入到下面那个重链的链顶即可。这样总的操作次数是均摊 O(nlogn)O(nlogn) 的,所以总复杂度就是 O(nlog2n)O(nlog2n)。
为了保证复杂度在点发生合并的时候需要维护一个树形结构。
P5314
给定一棵 nn 个节点的树,每个点有点权。两种操作:
- 链上点权 +z+z
- 每次给 kk,查询一个点相邻的所有点的点权 kth
我目前只会 O(nlog2n/loglogn)O(nlog2n/loglogn),不知道 1log 怎么做的
考虑每个点维护一个 ds,但只维护轻儿子信息,每次查询的时候加入重儿子和父亲。
这样每次修改就只有 O(logn)O(logn) 次修改啦。
然后修改次数 O(nlogn)O(nlogn),查询次数 O(n)O(n),改成 log 叉线段树就能除掉一个 loglog。
CF1172E
考虑对每个颜色算经过它的路径个数,容斥掉转为不经过他的路径个数。那么就相当于相当于扣掉这个颜色的点,然后求所有连通块大小的平方之和。下面我们称这种颜色的点为白点,其他颜色的点为黑点。
考虑对每个点维护他子树内和他在一个白点连通块内的点数个数 fufu,发现每次修改就是找到这个点上面的第一个黑点,然后把这条链上面的 ff 全都加减一个值。具体来说如果我们把 uu 从黑点变成白点,设 vv 是 uu 祖先中最深的黑点,那么只需要对 u→vu→v 这条链上(不包括 vv)的 ff 都加上 1+∑v∈son(u)fv1+∑v∈son(u)fv。如果是白变黑,那就是都减去这个值。
考虑怎么算答案,发现只需要对每个黑点算出它的所有儿子的 f2vf2v 之和,再求和即可。这里需要特判根节点是白点的情况。于是我们在修改颜色的时候统计这部分贡献即可。
现在需要支持链上 fi←fi+xfi←fi+x,以及查询一个点的所有儿子的 ff 的和。直接树剖,每个点维护其轻儿子 ff 的和与平方和,那么每次修改就只会修改 O(logn)O(logn) 个点。查询的时候再加上重儿子的 ff 的平方即可。这里还需要支持链加单点查询,树状数组配合 DFS 序即可解决。
方便起见我们认为 11 的父节点是 00,一定是一个黑点。如果把 uu 从白变黑,那么找到祖先中最深的黑点 pp,p→up→u 路径上第一个点是 qq,然后对 ff 造成的影响是 u→qu→q 路径上的 ff 都减去 fufu,同时对所有黑点的 ∑f2∑f2 的影响是加上 uu 的儿子的平方和,以及重新计算 qq 的 ff。如果是黑变白,找到上面第一个黑点 pp,同理也是链上 +fu+fu,同时答案要减掉 uu 的儿子的 f2f2 之和,然后重新计算 fqfq 并更新答案。
总的时间复杂度为 O(nlogn)O(nlogn)。
Moscow Pre-Finals Workshops 2022 Day 5
B
唯一的解是 11×13×17=2k×19+111×13×17=2k×19+1
J
n=1n=1 取 0.50.5,k≥102k≥102 时取 1.51.5,其他的二分
C
由于是无向图,一条边可以经过多次,于是只需要异或和为 00 或 2k−12k−1。
建 DFS 树求线性基即可。需要每个连通块单独做。然后需要这个连通块内出现所有颜色的边。
I
显然 Ai+Bi=pi−1Ai+Bi=pi−1,于是
只需要求 Ai≤pi−12Ai≤pi−12 的 AiAi 之和,以及全部的 AiAi 之和即可。
考虑一次操作对 AA 的影响:如果交换 px,pypx,py,对 i<xi<x 和 i>yi>y 的 AiAi 自然没有影响,对 [x+1,y−1][x+1,y−1] 中的影响是:
- 若原先 px<pypx<py,那么 [x+1,y−1][x+1,y−1] 中 px<pi<pypx<pi<py 的 AiAi 会减去 11。
- 若原先 px>pypx>py,那么 [x+1,y−1][x+1,y−1] 中 py<pi<pxpy<pi<px 的 AiAi 会增加 11。
分 pipi 为奇数或偶数讨论, 分别讨论一下
- pipi 为奇数:中间会有两个相同的即 pi−12,pi+12pi−12,pi+12,前面增后面减。这个时候我们需要分成四种情况来分别进行讨论,即 Ai≤pi−32,Ai≥pi+32,Ai=pi−12,Ai=pi+12Ai≤pi−32,Ai≥pi+32,Ai=pi−12,Ai=pi+12。
- pipi 为偶数:中间有一个不管咋修改都会让答案 −1−1,前面是增后面是减。考虑抽一个二命宵宫,很容易发现这时候有 Ai≤pi−22,Ai≥pi+22,Ai=pi2Ai≤pi−22,Ai≥pi+22,Ai=pi2 三种情况。
于是现在只需要查询 [l,r][l,r] 中 pi∈[s,t]pi∈[s,t] 的每种数的个数,显然可以离线做到 1log。
然后单独算 Ax,AyAx,Ay 也容易 1log。
L
显然答案 ≤4≤4,而且肯定不会是 11。
00 就判两个点是否相同,22 就是判度数 ≤90≤90。
考虑咋判 33,发现肯定有一步相切,那不妨让第一步相切,然后做中垂线即可找到中间点。
泪目了,人生第一次写计算几何没被卡精度
eJOI2023
B
看成最小化代价和做了一万年/fn
先考虑怎么判有解,发现如果 xixi 选了 cici,xjxj 选了 cjcj,那么会变成 2ci−xi,2cj−xj2ci−xi,2cj−xj,发现对 xi−xjxi−xj 造成的变化是:xi−xj→xj−xi+2(ci−cj)xi−xj→xj−xi+2(ci−cj)。
于是这可以看作一开始在 xi−xjxi−xj 这个点,每次可以从一个 ci−cjci−cj 跳一步对称点,问能否跳到 00。假设进行跳跃的点分别是 y1,y2,⋯,yky1,y2,⋯,yk,那么最终的点就是 2yk−2yk−1+2yk−2⋯2yk−2yk−1+2yk−2⋯,也就是 2×∑ki=1(−1)k−iyi2×∑ki=1(−1)k−iyi。
考虑后面一项可以取到什么值,你注意我们的点是所有的 ci−cjci−cj,也就是说如果存在 pp 可以跳,那么一定存在 −p−p 也可以跳;同时还一定存在 00。于是 (−1)k−i(−1)k−i 项是可以任意调整正负的,那么就变成了裴蜀定理:只需要 2×gcdi,j(ci−cj)2×gcdi,j(ci−cj) 是一开始的 xi−xjxi−xj 的约数即可。
然后考虑怎么求最小代价,首先注意到 gcd(A,B−A)=gcd(A,B)gcd(A,B−A)=gcd(A,B),于是只需要考虑相邻项的 ci−ci+1ci−ci+1。那你最优情况肯定是只取 ff 排序后相邻的 ci,ci+1ci,ci+1,那么最小化代价就是先整体二分,然后只考虑 |fi−fi+1|≤k|fi−fi+1|≤k 的这些项求区间 GCD 即可。在分治树上 BFS 维护全局的线段树支持单点修改,查询区间 GCD 即可。
求区间 GCD 的经典结论是 logNlogN 和 logVlogV 各自独立,因此复杂度为 O(QlogN(logN+logV)+NlogN)O(QlogN(logN+logV)+NlogN)。
模非质数做乘除法
设 mod=∏pαiimod=∏pαii,维护当前数中 modmod 的质因子也就是 p1,p2,⋯,pkp1,p2,⋯,pk 的次幂,然后我们维护的时候认为一个数实际上是 A×∏pciiA×∏pcii,这里 gcd(A,mod)=1gcd(A,mod)=1,除掉一个 B×∏pdiiB×∏pdii 就变成 A×B−1×∏pci−diiA×B−1×∏pci−dii。
这样单次乘除法复杂度是 O(ω(mod))O(ω(mod)),坏处是不能加减。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构