ACM 选做

Petrozavodsk Summer 2023. Day 7.

Link\text{Link}

D. HearthStone

称一个长度为 nn 的正整数数列是“好的”,当且仅当存在一个 kk,使得 1k1\sim k 均在 a1na_{1\sim n} 中出现过,且 maxi=1nai=k\max_{i=1}^n a_i=k。先给出一个序列,每次操作可以把其中一个数 +1+11-1,求将其变为“好的”数列的最小操作次数。1n,ai1061\le n,a_i\le 10^6

先给 aa 排个序,排序后若 ai>ia_i>i,则 aia_i 一定要变少,不妨先取个 min\min 提前算贡献。

aia_i 在操作结束后变成 bib_i,那么 bib_i 满足 bi{bi1,bi1+1},b0=0b_i\in \{b_{i-1},b_{i-1}+1\},b_0=0

考虑逐个加入 aia_i 求当 bi=xb_i=x 时的最小代价。

每次加入的代价都是个凸函数,故可以 slope trick。相当于每次将函数与函数向 xx 轴正方向平移取极值,再插入一个绝对值函数。前者可以直接将斜率为 00 的段平移,后者就是插入点。

I. 01tree

给出一个 nn 个结点的树,每个结点有一个点权 0011,每次可以把相邻两个权值相同的点点权翻转,已知初始状态和结束状态,求从初始状态到结束状态的最小操作次数,若达不到则次数为 00。 不幸的是,初始和结束状态有的 0,10,1 变成了 ??,即可以是 0011,所以问题改为求所有情况的最小操作次数的和。1n1051\le n\le 10^5

将两个相同的节点翻转看起来不好做,考虑转化。

注意到相邻的节点所在的深度奇偶性不同,于是可以把深度为奇数的点的点权翻转,这样一次操作就变成了交换两个点的点权。

考虑计算每条边的贡献,显然只要这条边断开形成的两个子树内的 11 达到结束状态的数量即可。

S1,S2,T1,T2S_1,S_2,T_1,T_2 表示初始状态时整棵树的 1,?1,? 的个数、结束状态时整棵树的 1,?1,? 的个数。再令 s1,s2,t1,t2s_1,s_2,t_1,t_2 表示边分成的较小的子树中的初始、结束状态时的 1,?1,? 的个数。

那么有

ans=(u,v)Ed=1d[i(s2is1)(t2idt1)][j(S2s2jS1+s1)(T2t2j+dT1+t1)]+d[i(s2is1)(t2i+dt1)][j(S2s2jS1+s1)(T2t2jdT1+t1)]ans=\sum_{(u,v)\in E}\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg]+d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i+d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j-d-T_1+t_1}\bigg]

考虑求

sum=d=1d[i(s2is1)(t2idt1)][j(S2s2jS1+s1)(T2t2j+dT1+t1)]sum=\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{i-s_1}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{j-S_1+s_1}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg] =d=1d[i(s2s2+s1i)(t2idt1)][j(S2s2S2+S1s2s1j)(T2t2j+dT1+t1)]=\sum_{d=1}^\infty d\bigg[\sum_{i}\binom{s_2}{s_2+s_1-i}\binom{t_2}{i-d-t_1}\bigg]\bigg[\sum_{j}\binom{S_2-s_2}{S_2+S_1-s_2-s_1-j}\binom{T_2-t_2}{j+d-T_1+t_1}\bigg]

最内层的 \sum 显然可以范德蒙德卷积:

sum=d=1d(s2+t2s2+s1t1d)((S2s2)+(T2t2)(S2s2)+(S1s1)(T1t1)+d)sum=\sum_{d=1}^\infty d\binom{s_2+t_2}{s_2+s_1-t_1-d}\binom{(S_2-s_2)+(T_2-t_2)}{(S_2-s_2)+(S_1-s_1)-(T_1-t_1)+d}

考虑到 d=s2+s1t1(s2+s1t1d)d=s_2+s_1-t_1-(s_2+s_1-t_1-d),令 A=s2+t2,B=s2+s1t1,x=BdA=s_2+t_2,B=s_2+s_1-t_1,x=B-d,则

sum=d=1[B(Bd)](ABd)(S2+T2AS2+S1T1(Bd))sum=\sum_{d=1}^\infty [B-(B-d)]\binom{A}{B-d}\binom{S_2+T_2-A}{S_2+S_1-T_1-(B-d)} =Bx=0B1(Ax)(S2+T2AS2+S1T1x)x=0B1x(Ax)(S2+T2AS2+S1T1x)=B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-\sum_{x=0}^{B-1}x\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x} =Bx=0B1(Ax)(S2+T2AS2+S1T1x)Ax=0B1(A1x1)(S2+T2AS2+S1T1x)=B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-A\sum_{x=0}^{B-1}\binom{A-1}{x-1}\binom{S_2+T_2-A}{S_2+S_1-T_1-x} =Bx=0B1(Ax)(S2+T2AS2+S1T1x)Ax=0B2(A1x)(S2+T2AS2+S1T11x)=B\sum_{x=0}^{B-1 }\binom{A}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-x}-A\sum_{x=0}^{B-2}\binom{A-1}{x}\binom{S_2+T_2-A}{S_2+S_1-T_1-1-x}

设函数 f(P,Q,S,T)f(P,Q,S,T) 表示 x=0Q(Px)(SPTx)\sum_{x=0}^{Q }\binom{P}{x}\binom{S-P}{T-x}

那么 sum=B×f(A,B1,S2+T2,S2+S1T1)A×f(A1,B2,S2+T21,S2+S1T11)sum=B\times f(A,B-1,S_2+T_2,S_2+S_1-T_1)-A\times f(A-1,B-2,S_2+T_2-1,S_2+S_1-T_1-1)

当沿着树计算边的贡献时 A,BA,B 的变化是 O(1)O(1) 的故考虑求 ff 的递推式。

QQ 的变化是显然的:

f(P,Q+1,S,T)f(P,Q,S,T)+(PQ+1)(SPTQ1)f(P,Q+1,S,T)\leftarrow f(P,Q,S,T)+\binom{P}{Q+1}\binom{S-P}{T-Q-1} f(P,Q1,S,T)f(P,Q,S,T)(PQ)(SPTQ)f(P,Q-1,S,T)\leftarrow f(P,Q,S,T)-\binom{P}{Q}\binom{S-P}{T-Q}

对于 PP,考虑用加法原理分解:

(Px)(SPTx)=(Px)[(SP1Tx)+(SP1T1x)]\binom{P}{x}\binom{S-P}{T-x}=\binom{P}{x}\bigg[\binom{S-P-1}{T-x}+\binom{S-P-1}{T-1-x}\bigg] (P+1x)(SP1Tx)=[(Px)+(Px1)](SP1Tx)\binom{P+1}{x}\binom{S-P-1}{T-x}=\bigg[\binom{P}{x}+\binom{P}{x-1}\bigg]\binom{S-P-1}{T-x}

作差再求和可得:

f(P+1,Q,S,T)f(P,Q,S,T)(PQ)(SP1TQ1)f(P+1,Q,S,T)\leftarrow f(P,Q,S,T)-\binom{P}{Q}\binom{S-P-1}{T-Q-1} f(P1,Q,S,T)f(P,Q,S,T)+(P1Q)(SPTQ1)f(P-1,Q,S,T)\leftarrow f(P,Q,S,T)+\binom{P-1}{Q}\binom{S-P}{T-Q-1}

于是就做完了,注意边界的处理。

J. Independent Set

交互题。有一张 nn 个点 mm 条边的无向图,可能有重边或自环,要求求出这张图所有的边。每次可以询问一个数列 a1,a2,...,ak(1ain)a_1,a_2,...,a_k(1\le a_i\le n)kk 每次由自己决定。每次询问后,交互库会开一个空集 SS,和一个长度为 kk 的数组 cnt1,cnt2,...,cntkcnt_1,cnt_2,...,cnt_k,并将该数组初始化为 00。然后进行如下操作:

1.将 a1a_1 放入集合 SS

2.枚举 i[2,n]i\in[2,n],扫描图中 aia_i 的所有边 (ai,j)(a_i,j),若 jSj\in S,则令 cnticnt_i11;若扫描完所有边后 cnticnt_i 等于 00,则将 aia_i 加入 SS

3.返回 cntcnt 数组。

1n4000,0m100001\le n\le 4000,0\le m\le 10000,询问的 kk 的和不超过 176000176000

先求自环,可以通过问自己两次得到。

然后先把 1n1\sim n 放在一起问一遍,这个就得到了一个独立集 S1S_1 和另一个集合 S2S_2S2S_2 内部的边可以递归求解,故只需考虑 S1S_1S2S_2 之间的边,这样就可以分治,把 S1S_1 分成左右两半,往有边的一半分治,就可以把求出一条边的花费变为对数级。

Petrozavodsk Winter 2023. Day 2: GP of ainta

Link\text{Link}

K. Connect the Dots

数轴上有 nn 个点,第 ii 个点的坐标为 ii,每个点有一个颜色,总共 mm 种颜色,你要构造一个选若干个不同线段的方案,使其满足以下条件并且数量最多:

  • 线段的两个端点为 11nn 的整数,且端点的颜色不同。
  • 任意两条线段要么相离要么包含,不能相交(端点重合不算相交)。

2mn2×1052\le m\le n\le 2\times 10^5

对于这种端点可交线段的问题,可以采用经典的化直为圆,即将线段当成 1n1\sim n 构成的环上的弦。这样题目就转化为不相交弦的最大数量。

对于相邻的颜色不同的点,可以先把他们记入答案,这样接下来取的弦只能是多边形的对角线,同时随着其他弦的加入,他们也可以成为多边形的新边。另外,这个转化也告诉了我们答案的上界,由于从一个点出发,多边形的对角线条数为 n3n-3,故答案不超过 2n32n-3

接下来考虑从多边形中取一段来分析不能使答案变劣的操作(下文 A,B,C\texttt{A,B,C} 均为颜色)。

  • ABB...BBAB\texttt{ABB...BB}\Rightarrow \texttt{AB}:考虑逐次把 A\texttt{A} 旁边的 B\texttt{B} 扔掉,即与隔一个的 B\texttt{B} 连边。

这种操作相当于把连续段变成一个单点,可让图变成不同颜色交替的圆。

  • 若存在一种颜色,使其只出现了一次,那么可以从该点出发,依次取弦,得到最优答案。

正确性显然。

将连续段改成单点后,若出现唯一颜色点,则可按上面的做法做,若没有,考虑将 ABC\texttt{ABC} 变成 AC\texttt{AC},就能变成上面的情况。然而,当且仅当出现至少 33 种颜色才能这么构造,特殊情况便是形如 ABABABABAB\texttt{ABABABABAB} 之类的环,这种也很好处理,将第一个 A\texttt{A} 与不相邻的 B\texttt{B} 连边即可。

Petrozavodsk Winter 2023. Day 4: KAIST+KOI Contest, Grand Prix of Korea

Link\text{Link}

G. One Path

给出一棵 nn 个节点的树,边带权,定义一张图的权值为任意两点之间最短路的最大值,不连通的两点的最短路长度定义为 00。对于每个 i[0,k]i\in[0,k],你可以恰好执行 ii 次操作,每次操作可以切断一条边,并给当前的图加上一条与切断的边权值相同的边,没必要保证操作后图仍为一棵树。对于每个 ii,求出操作后能得到的图的权重的最大值。

2n2000,0k20002\le n\le 2000,0\le k\le 2000

显然操作完后仍然是树答案不会更劣,因此一次操作的实质是将树分成两部分,再把这两部分连接。一棵树的权重显然是其直径,所以执行 xx 次操作相当于选出 xx 条边,答案为这 xx 条边的边权和他们划分出的子树的直径之和。

考虑 dpdp,设 fu,i,0/1/2f_{u,i,0/1/2} 表示在 uu 的子树内执行 ii 次操作的答案,状态 00 表示选出了一条向上的链,11 表示已经凑出了一条直径,22 表示在 11 的基础上选了一条边,大力树形 dpdp 即可。

Petrozavodsk Winter 2023. Day 6: Um_nik mod 998 244 353 Contest

Link\text{Link}

K. 4

给出一张 nn 个点 mm 条边的简单无向图,求阶为 44 的完全子图数量。

4n105,0m1054\le n\le 10^5,0\le m\le 10^5

类似三元环计数,我们将度数小的点向度数大的点连边,最终形成一个 DAGDAG,枚举点 aa 及其指向的点 BB,再枚举点 BB 指向的点 CC,若 A,CA,C 间有边,则称边 (A,C)(A,C) 是点 BB 的一条对边。我们给每条边标号,对每个点的对边建立集合 S(B)S(B)。对于原图中的每条边 (B,D)(B,D),所有 S(B)S(D)|S(B)\cap S(D)| 的和记为答案,可用 bitsetbitset 维护。

时间复杂度 O(mm+nmw)O(m\sqrt m+\frac{nm}{w})

posted @ 2024-09-30 08:38  luckydrawbox  阅读(112)  评论(0)    收藏  举报  来源