2024.10.22总结


今天打两场

byd放三道黑是吧。

第一场:

A:

CF1261F

将区间拆分为 [x2i,(x+1)2i)[x2^{i},(x+1)2^{i}) 的形式,发现两个区间中的数两两异或后形成的仍为一个区间,将 A,B 都拆分后区间两两异或会得到 O(n2log2n)O(n^2\log^2n) 个区间,取并即为答案,但复杂度无法接受。

发现对于两个区间 [x2i,(x+1)2i),[y2j,(y+1)2j),i>j[x2^i,(x+1)2^i),[y2^j,(y+1)2^j),i>j,其异或后得到的结果仍是高位固定,后 ii 位任意取,也就是第二个区间中有一段是不用考虑的,这是因为这一段在第一个区间中是任意取的。在线段树上就是只用考虑同一深度的区间,这样得到的区间个数就为 O(n2logn)\mathcal O(n^2\log n) 了。

用线段树来实现即可,dfs 的过程中记录当前高位的异或值,当有区间被完全覆盖后就返回。

B:

CF1268E

首先考虑一棵树的情况,设一开始 f[i]=1f[i]=1

把边按边权从大到小插入,假设插入边 (u,v,i)(u,v,i)

显然 f[u]=f[v]=f[u]+f[v]f[u]=f[v]=f[u]+f[v]

考虑仙人掌的情况,先考虑一个环,无非就是链接最小边的时候,最大边两端的会被多算一次,减掉即可。

g[i]=f[u]+f[v]g[i]=f[u]+f[v]

那么就是 f[u]=f[v]=f[u]+f[v]g[max(C)],g[i]=f[u]+f[v]f[u]=f[v]=f[u]+f[v]-g[\max(C)],g[i]=f[u]+f[v]max(C)\max(C) 表示当前环上的最大边。

C:

P7729

没改动。

第二场:

A:

二分安全系数,每个点的 L,RL,R 可以看成赋值 0/10/1 ,对不能同时选的的点对进行约束,2-SAT 即可。

B:

f[i]f[i] 表示从 [L,R][L, R] 中选择出不完全相同的 NN 个数,GCDGCDi×Ki\times K 的方案数,

则:

f[i]=(RKiL1Ki)Nf[i]=(\lfloor\frac{R}{Ki}\rfloor-\lfloor\frac{L-1}{Ki}\rfloor)^N

其中完全相同的和 i×KGCDi\times K|GCD 的方案数为:(RL+1)+ij,ijj×K<RLf[j](R-L+1)+\sum\limits_{i|j,i\neq j}^{j\times K<R-L}f[j]

这部分是重复的,容斥,得:

f[i]=(RKiL1Ki)N(RL+1)ij,ijj×K<RLf[j]f[i]=(\lfloor\frac{R}{Ki}\rfloor-\lfloor\frac{L-1}{Ki}\rfloor)^N-(R-L+1)-\sum\limits_{i|j,i\neq j}^{j\times K<R-L}f[j]

从大到小枚举 ii 进行 DPDP 即可,结果即为 f[1]f[1],但是需要特判掉 K[L,R]K\in[L,R] 的情况。

NN 比较大,快速幂需要用一下欧拉定理。

C:

将每个点点权转为到根路径和,查询即为查询子树内最大值,修改为子树内加减,树剖 + 线段树即可。