杂题收录+简要题解2

洛谷P6158 封锁

给出一个 n ∗ n n*n nn的网格图,每条边有两个边权。求一个左上角到右下角的割使得 ( 第 一 个 边 权 之 和 ) ∗ ( 第 二 个 边 权 之 和 ) (第一个边权之和)*(第二个边权之和) 最小。
n ≤ 400 n\le 400 n400

跟最小乘积生成树的做法类似,把每种方案看成二维平面上的一个点 ( ∑ x , ∑ y ) (\sum x,\sum y) (x,y),其中 x , y x,y x,y分别为两个边权,那么答案一定在下凸壳上。先分别找到横坐标最小和纵坐标最小的点,然后通过设置边权来找到在它们下方且离它们最远的点,然后递归下去。

Codeforces 1305F Kuroni and the Punishment

给出 n n n个数,每次可以将某个数加 1 1 1或减 1 1 1,并花费 1 1 1的代价,且需要保证操作后仍然是正数。问最少花费多少代价,使得这 n n n个数的 gcd ⁡ \gcd gcd大于 1 1 1
n ≤ 2 ∗ 1 0 5 , a i ≤ 1 0 12 n\le 2*10^5,a_i\le 10^{12} n2105,ai1012

注意到答案的上界是 n n n。因此最优情况下,操作次数不大于 1 1 1次的数至少有 n 2 \frac{n}{2} 2n个。故只需要每次随机选一个数 x x x,并暴力把 x − 1 , x , x + 1 x-1,x,x+1 x1,x,x+1分解质因数,然后计算并取最优值即可。

Codeforces 1322B Present

给出 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an,求 a i + a j ( i < j ) a_i+a_j(iai+aj(i<j) n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)个数的异或和。
n ≤ 400000 , a i ≤ 1 0 7 n\le 400000,a_i\le 10^7 n400000,ai107

对每一位分别计算贡献。假设当前是第 i i i位,则把 n n n个数在模 2 i 2^i 2i意义下排序,可以发现在每个数前面,且加上这个数能够进位到 2 i 2^i 2i的一定是连续的一段,并且左端点单调不增。于是只要对 2 i 2^i 2i 0 / 1 0/1 0/1的两种情况分别讨论即可。
时间复杂度 O ( n log ⁡ V ) O(n\log V) O(nlogV)

Codeforces 1322C Instant Noodles

给一个 2 n 2n 2n个点的二分图,右边的点有点权。设 S S S为左边的点的子集, N ( S ) N(S) N(S)为属于右边且至少与 S S S中一个点有边相连的点的集合, f ( S ) f(S) f(S)表示 N ( S ) N(S) N(S)的点权和。对于所有可能的 S S S,求 f ( S ) f(S) f(S) gcd ⁡ \gcd gcd
n ≤ 500000 n\le500000 n500000

考虑两个交集为空的集合 S 1 , S 2 S_1,S_2 S1,S2 S = S 1 + S 2 S=S_1+S_2 S=S1+S2对答案的限制是 gcd ⁡ ( f ( S 1 ∩ S 2 ) , f ( S \ S 1 ) , f ( S \ S 2 ) ) \gcd(f(S_1\cap S_2),f(S\backslash S_1),f(S\backslash S_2)) gcd(f(S1S2),f(S\S1),f(S\S2))。可以理解成把右边的点集的划分作了限制。发现只有与左边的点的连边情况相同的点能够分为一组。于是先对连边情况排序,然后把相同的分为一组,并对每组的权值和求个 gcd ⁡ \gcd gcd就是答案了。
时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)

【Atcoder】【Social Infrastructure Information Systems Division, Hitachi Programming Contest 2020】【E - Odd Sum Rectangles】

构造一个 ( 2 N − 1 ) ∗ ( 2 M − 1 ) (2^N-1)*(2^M-1) (2N1)(2M1) 01 01 01矩阵,使得和为奇数的子矩阵数量最多。
N , M ≤ 10 N,M\le 10 N,M10

不妨假设 N ≥ M N\ge M NM。固定子矩阵的左右边界 j 1 , j 2 j_1,j_2 j1,j2,令 f ( i ) = S ( 1 , i , j 1 , j 2 ) f(i)=S(1,i,j_1,j_2) f(i)=S(1,i,j1,j2),那么左右边界为 j 1 , j 2 j_1,j_2 j1,j2的子矩阵的贡献为 f ( i ) f(i) f(i) 0 0 0的个数乘 1 1 1的个数。不难发现答案的上界为 ( H 2 ) 2 W ( W − 1 ) 2 (\frac{H}{2})^2\frac{W(W-1)}{2} (2H)22W(W1)。下面构造一个满足该上界的答案。
假设 N = M N=M N=M,且已经构造出大小为 ( 2 N − 1 ) ∗ ( 2 N − 1 ) (2^N-1)*(2^N-1) (2N1)(2N1)的合法方案。对于 N + 1 N+1 N+1的情况,我们把矩阵的四个角落填上 N N N的方案,然后让 ( 2 N , 2 N ) (2^N,2^N) (2N,2N)的值为 1 1 1,第 2 N 2^N 2N行和第 2 N 2^N 2N列的值为 0 0 0。不难验证这样的构造是满足条件的。

Codeforces 1325E Ehab’s REAL Number Theory Problem

给出 n n n个数 a 1 , ⋯   , a n a_1,\cdots,a_n a1,,an,满足 a i a_i ai有不超过 7 7 7个因子。问最少选出多少个数,使得这些数的乘积是完全平方数。
n ≤ 1 0 5 , a i ≤ 1 0 6 n\le 10^5,a_i\le 10^6 n105,ai106

a i a_i ai的平方因子除掉后,就只剩下一个或两个指数为 1 1 1的素因子。若 a i a_i ai是素数,则在 a i a_i ai 1 1 1之间连边,否则在 a i a_i ai的两个素因子之间连边,答案就是图中的最小环。
求最小环可以从每个点出发bfs,把bfs树建出来后在所有非树边组成的环中挑一个最小的。
这样做是 O ( n 2 ) O(n^2) O(n2)的。但容易发现每个环中都至少包含一个不大于 V \sqrt V V 的素数,于是只需要枚举不超过 V \sqrt V V 的点为起点bfs即可。

Codeforces 1325F Ehab’s Last Theorem

给出 n n n个点 m m m条边的连通无向图,设 d = ⌈ n ⌉ d=\lceil\sqrt n\rceil d=n ,求一个有 d d d个点的独立集,或是至少有 d d d个点的简单环。
n ≤ 1 0 5 n\le 10^5 n105

有两种做法:
第一种是把dfs树建出来,对于从下到上的每个点,若该点有小于 d − 1 d-1 d1条返祖边,则把该点加入独立集,并把返祖边连向的祖先删掉。否则只要在其中找到深度最小的祖先,则这两点之间构成一个满足条件的环。
第二种是每次找度数最小的点,若该点度数小于 d − 1 d-1 d1,则将其加入独立集,并把与它有边相连的点删掉。若某个时刻所有点的度数都至少为 d − 1 d-1 d1,则容易构造出一个大小至少为 d d d的环。

AtCoder Grand Contest 043 C - Giant Graph

有三个 n n n个点的简单无向图 X , Y , Z X,Y,Z X,Y,Z,构造一个有 3 n 3n 3n个点的无向图,每个节点表示为 ( x , y , z ) (x,y,z) (x,y,z),其中 x , y , z x,y,z x,y,z表示在 X , Y , Z X,Y,Z X,Y,Z中的点。两个点 ( x 1 , y 1 , z 1 ) , ( x 2 , y 2 , z 2 ) (x_1,y_1,z_1),(x_2,y_2,z_2) (x1,y1,z1),(x2,y2,z2)之间有连边当且仅当其中两位相等,且另一维在原图中对应的点有连边。定义一个点的权值为 ( 1 0 18 ) x + y + z (10^{18})^{x+y+z} (1018)x+y+z,求新图的最大权独立集。
n ≤ 1 0 5 , m ≤ 1 0 5 n\le 10^5,m\le 10^5 n105,m105

贪心地想,肯定是每次找一个权值最大的点,然后把这个点相邻的点删掉。设 d p 0 [ x , y , z ] dp_0[x,y,z] dp0[x,y,z]表示 ( x , y , z ) (x,y,z) (x,y,z)这个点是否被选,转移显然。
再考虑这样一个游戏:在每个图的某个节点上有一颗石子,每次可以将某个图中的石子移到相邻且标号比当前节点大的点上,不能操作者输。设 d p 1 [ x , y , z ] dp_{1}[x,y,z] dp1[x,y,z]表示当前状态为 ( x , y , z ) (x,y,z) (x,y,z)时选手是否会输。
不难发现两个dp数组的值相等。并且第二个dp数组的值刻意通过求出每个图的sg函数值来得到。那么只要分别求出每个图的sg函数值,并求出所有异或值为 0 0 0方案的权值和即可。

AtCoder Grand Contest 043 D - Merge Triplets

问有多少个 1 1 1 3 n 3n 3n的排列可以被如下方式构造得到:有 n n n个长度为 3 3 3的序列,每次移除所有序列的第一个数中最小的那个并将其加入到排列末端,重复此过程 3 n 3n 3n次。
n ≤ 2000 n\le 2000 n2000

若有某一个数 x x x,它所在的序列中有一个比它大的数 y y y在它前面,那么选了 y y y之后就会立刻选 x x x。这样就可以把某个数和它后面的比它小的数合并成一块。那么最终的排列就是将每一块按第一个数从小到大排序,然后首尾相接。这样一个排列就跟一种分块方案一一对应。
而一种分块方案是合法的,当且仅当每个块的大小不超过 3 3 3,且大小为 1 1 1的块不少于大小为 2 2 2的块。假定分为 k k k块,大小分别为 a 1 , ⋯   , a k a_1,\cdots,a_k a1,,ak,则能构造出的排列数为 ( 3 n ) ! a 1 ∗ ( a 1 + a 2 ) ∗ ⋯ ∗ ( a 1 + ⋯ + a k ) \frac{(3n)!}{a_1*(a_1+a_2)*\cdots*(a_1+\cdots+a_k)} a1(a1+a2)(a1++ak)(3n)!

这是因为最后一块的第一个数必须是 3 n 3n 3n,然后后面的 a k − 1 a_k-1 ak1个数可以任意选,不断递归下去就得到了上述式子。
那么就可以设 d p i , j dp_{i,j} dpi,j表示选了若干组的大小之和为 i i i,大小为 1 1 1的块数量减去大小为 2 2 2的块数量等于 j j j的贡献和。复杂度 O ( n 2 ) O(n^2) O(n2)

洛谷U107962 魔法

给出长度为 n n n的序列 a a a,定义 F l , l = a l , F l , r = F l + 1 , r + F l , r − 1 F_{l,l}=a_l,F_{l,r}=F_{l+1,r}+F_{l,r-1} Fl,l=al,Fl,r=Fl+1,r+Fl,r1。有 q q q次询问,每次给出 l , r l,r l,r,询问 F l , r F_{l,r} Fl,r的值。
n , q ≤ 2.5 ∗ 1 0 5 n,q\le 2.5*10^5 n,q2.5105

可以发现 F l , r = ∑ i = l r ( r − l i − l ) a i F_{l,r}=\sum_{i=l}^r\binom{r-l}{i-l}a_i Fl,r=i=lr(ilrl)ai

设块的大小为 B B B g i , j = F i , i + B ∗ j g_{i,j}=F_{i,i+B*j} gi,j=Fi,i+Bj。若令 r − l = k ∗ B + d r-l=k*B+d rl=kB+d,则 F l , r = ∑ i = 0 d ( d i ) g l + i , k F_{l,r}=\sum_{i=0}^d\binom{d}{i}g_{l+i,k} Fl,r=i=0d(id)gl+i,k

考虑如何求 g g g。发现在 r − l r-l rl固定时,可以通过把 a a a数组翻转后与 ( x + 1 ) r − l (x+1)^{r-l} (x+1)rl进行卷积来求对应的 F F F,那么就可以NTT预处理 g g g了。
时间复杂度 O ( n B ∗ n log ⁡ n + q B ) O(\frac{n}{B}*n\log n+qB) O(Bnnlogn+qB)

Codeforces 1334G Substring Search

给一个长度为 26 26 26的排列 p p p和由小写字母组成的串 s s s t t t,求 t t t的每一个长度为 ∣ s ∣ |s| s的子串是否与 s s s匹配。设 t ′ t' t t t t的子串,则 t ′ t' t s s s匹配当且仅当 t i ′ = s i t'_i=s_i ti=si或者 t i ′ = p [ s i ] t'_i=p[s_i] ti=p[si] 1 ≤ i ≤ ∣ s ∣ 1\le i\le |s| 1is成立。这里定义 ′ a ′ = 1 , ′ b ′ = 2 'a'=1,'b'=2 a=1,b=2,如此类推。
∣ s ∣ ≤ ∣ t ∣ ≤ 2 ∗ 1 0 5 |s|\le |t|\le 2*10^5 st2105

设排列 p p p的某一个环上的元素依次为 c 0 , ⋯   , c k − 1 c_0,\cdots,c_{k-1} c0,,ck1,则令 s s s中对应字符为 c i c_i ci的位置为辐角为 2 π i k \frac{2\pi i}{k} k2πi模长为 1 1 1的复数, t t t中对应字符为 c i c_i ci的位置为辐角为 π − 2 π i k \frac{\pi - 2\pi i}{k} kπ2πi模长为 1 1 1的复数。这样若 s s s t t t两个位置的字符可以匹配上,则它们对应复数的乘积为辐角等于 π k \frac{\pi}{k} kπ − π k -\frac{\pi}{k} kπ的复数,满足实部等于 cos ⁡ π k \cos\frac{\pi}{k} coskπ,否则实部的值就会与 cos ⁡ π k \cos\frac{\pi}{k} coskπ有较大差距。因此我们只要把 s s s t t t对应的数字串卷积起来,就可以得到 t t t的每个子串的数字串和 s s s的数字串对应位相乘再相加的结果,再判断与目标结果是否相等即可。
但不同环上的字符也可能被误认为匹配,这时需要先用kmp判一遍是否对应字符都在同一个环上即可。

Codeforces 1340F Nastya and CBS

有一个长度为 n n n的括号序列,其中包含 k k k种不同的括号。每次修改一个位置的括号,或判断一段区间是否是一个合法括号序。
n , q ≤ 100000 n,q\le 100000 n,q100000

定义如果一段区间是合法的,如果它在消去匹配的括号后变成一段右括号+一段左括号的形式。用线段树维护每一段合法区间的右括号序列和左括号序列的哈希值。合并的时候,讨论左区间的右括号序列和右区间的左括号序列的相对大小,然后再递归求出较长那一段的前缀或后缀哈希值。
时间复杂度 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

Codeforces 1342F Make It Ascending

给一个数组 a a a,每次操作可以选择两个数 p , q p,q p,q,令 a q = a p + a q a_q=a_p+a_q aq=ap+aq,并把 a p a_p ap删掉。问最少需要多少次操作把数组变为单调递增。
n ≤ 15 n\le 15 n15

可以看成新数组中的一个数是由原来数组中的若干个数拼在一起形成的。设 f i , j , m a s k f_{i,j,mask} fi,j,mask表示用 m a s k mask mask中的数,拼成了长度为 i i i的递增数组,其中第 i i i个数的位置在原数组的的位置 j j j上,第 i i i个数最小是多少。转移的时候枚举子集,然后对新的数贪心选择尽量靠左的位置放置。
时间复杂度 O ( n 2 3 n ) O(n^23^n) O(n23n)

Codeforces 1348F Phoenix and Memory

n n n个人和 n n n个位置,每个人可以匹配的位置是一段区间,保证存在完美匹配,问完美匹配是否唯一。
n ≤ 200000 n\le 200000 n200000

先用贪心求出一个完美匹配:按编号从小到大确定每个位置匹配的区间,每次选取包含当前位置且还没被选择的区间中右端点编号最小的即可。
把人和位置看成有向二分图,把匹配上的人和位置缩成一个点,则完美匹配唯一当且仅当缩点后的图是一个DAG。用线段树优化拓扑排序即可。

Codeforces 1349D Slime and Biscuits

n n n个人,第 i i i个人有 a i a_i ai块饼干。每次从所有饼干中随机选择一块,并随机交给除了该饼干的主人以外的 n − 1 n-1 n1个人中的其中一个。问所有饼干都位于同一个人手里所需的期望时间。
n ≤ 1 0 5 , ∑ a i ≤ 3 ∗ 1 0 5 n\le 10^5,\sum a_i\le 3*10^5 n105,ai3105

E x E_x Ex表示结束时所有饼干均位于第 x x x个人手里的期望时间乘上对应概率的值, P x P_x Px表示结束时所有饼干在第 x x x个人手里的概率, E x ′ E_x' Ex表示从初始状态到所有饼干位于第 x x x个人手中的期望时间, C C C表示从全部饼干位于某个人手里的状态到全部位于另一个人手里的状态的期望时间。则有 a n s = ∑ i = 1 n E i , ∑ i = 1 n P i = 1 ans=\sum_{i=1}^nE_i,\quad \sum_{i=1}^nP_i=1 ans=i=1nEi,i=1nPi=1

且不难得到关系式 E x = E x ′ + ∑ i = 1 n [ i ≠ x ] ( E i + C P i ) E_x=E_x'+\sum_{i=1}^n[ i\neq x](E_i+CP_i) Ex=Ex+i=1n[i=x](Ei+CPi)

x = 1 , 2 , ⋯   , n x=1,2,\cdots,n x=1,2,,n对应关系式的等号两侧求和,得到 n ∗ a n s = ∑ i = 1 n E i ′ + ( n − 1 ) C n*ans=\sum_{i=1}^nE_i'+(n-1)C nans=i=1nEi+(n1)C

f i f_i fi表示从某个人手里有 i i i块饼干的状态,到这个人手里有 i + 1 i+1 i+1块饼干的状态的期望时间。递推出 f f f后就可以求出 E i ′ E_i' Ei C C C

Atcoder NOMURA Programming Competition 2020 D - Urban Planning

n n n个点的无向图。每个点可以选择除了它以外的一个点,表明这两个点必须属于同一个连通块。现在有一些点的选择已经固定,问其他点任意选择的所有情况下,图中最少存在的边数之和。
n ≤ 5000 n\le 5000 n5000

如果把边看成有向边,那么原图已有的边组成的弱连通块,要么是生成树,要么是生成树加一个环,最终的图的每个连通块必然都是一个环套树。可以转化为求每种方案中环的数量之和。图中固定的环可以直接计数。若由大小为 A 1 , ⋯   , A k A_1,\cdots,A_k A1,,Ak的生成树连通块组成一个环,容易得出方案数为 A 1 ⋯ A k ( k − 1 ) ! A_1\cdots A_k(k-1)! A1Ak(k1)!,因此求出 d p i , j dp_{i,j} dpi,j表示前 i i i个连通块中,选出 j j j个构成一个环的方案数之和即可。
时间复杂度 O ( n 2 ) O(n^2) O(n2)

AtCoder Grand Contest 046 B - Extension

有一个 A ∗ B A*B AB的网格,每个格子都是白色。现在每次可以选择在网格右边增加一列,并把这一列上的某个格子染成黑色;或在网格上面增加一行,并把这一行上的某个格子染成黑色。问将网格变为 C ∗ D C*D CD的大小后,有多少种不同的染色方案。
A ≤ C ≤ 3000 , B ≤ D ≤ 3000 A\le C\le 3000, B\le D\le 3000 AC3000,BD3000

考虑将一种染色方案与一种构造方案一一对应。对于一种染色方案,若最上面一行恰好有一个黑点,则钦定最后一种操作为添加一行;否则为添加一列。可以设 d p i , j , 0 / 1 dp_{i,j,0/1} dpi,j,0/1表示 i ∗ j i*j ij的网格,最上面一行是否恰好只有一个黑点的染色方案数。
时间复杂度 O ( C D ) O(CD) O(CD)

Codeforces 367C Sereja and the Arrangement of Numbers

给出 m m m个不同的数,每个数都有对应的费用。现在要在 m m m个数中选择一些数(每个数可以使用任意多次,但是代价只会计算一次),用这些数组成一个长度为 n n n的序列,并且满足任意两个不同种类的数,至少有一次相邻。问最大费用。
n ≤ 2 ∗ 1 0 6 , m ≤ 1 0 5 n\le 2*10^6,m\le 10^5 n2106,m105

贪心后转化为,给一个 k k k,求一个最短的序列,满足 k k k个数中的任意两个数至少相邻一次,问序列长度。可以看成 k k k个点的完全图中,找一条最短的路径经过每条边至少一次。
k k k为奇数时,每个点的度数均为偶数,故存在欧拉路径。当 k k k为偶数时,每个点的度数是奇数,需要增加 k 2 − 1 \frac{k}{2}-1 2k1条边,使得只剩下两个点的度数是奇数,此时也存在欧拉路径。

【XIX Open Cup named after E.V. Pankratiev. Grand Prix of Siberia, Division 1】K. Recursive circuit

一个电路有 k k k 个端口。电路是嵌套定义的,定义一个电路的时候,给出 n n n 个点,和 s s s 个子模块, 1 1 1 k k k 号点为该电路的端口, t k + j tk+j tk+j 是第 t t t 个子模块的第 j j j 个端口,其余为额外端口。 k ( s + 1 ) ≤ n k(s+1)\le n k(s+1)n。再给出这 n n n 个点的 m m m 条边。现在给出 q q q 次询问,每次问电路的两个端口 a , b ( a , b ≤ k ) a,b(a,b\le k) a,b(a,bk),问它们是否连通,如果连通,连通路径最少进入几层嵌套。
k ( s + 1 ) ≤ n ≤ 1 0 5 , m , q ≤ 1 0 5 k(s+1)\le n\le 10^5,m,q\le 10^5 k(s+1)n105,m,q105
杂题收录+简要题解2_第1张图片

给每条边赋一个时间值,初始输入的边时间值为 0 0 0。按时间顺序加入边,并维护 n n n 个点之间的连通性。若某条边连接了的两个集合中均包含最外层电路的端点,则分别从两个集合中挑出一个,并在 s s s 个子电路对应的两个点之间新增一条边,时间值为当前边的时间值+1。

时间值的意义是,最少需要进入这么多层电路,才能将对应的两个集合连通。把合并的过程建树,就转化为求路径上边权最大值。

只有不超过 k − 1 k-1 k1 次合并会新增边,故新增的边不超过 s ( k − 1 ) s(k-1) s(k1) 条。复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

AtCoder Beginner Contest 171 F - Strivore

对一个给定的字符串 S S S 进行 K K K 次操作,每次可以往 S S S 中添加一个小写字母,问最终可以得到多少种不同的字符串。
∣ S ∣ , K ≤ 1 0 6 |S|,K\le 10^6 S,K106

小清新计数题。若 S S S 以子序列的方式在新串中最后一次出现的位置固定了,则首字母前的位置有 26 26 26 种填法,其余位置由于不能跟前一个原串中的字母相同,所以有 25 25 25 种填法。可以枚举首字母位置然后统计答案。
时间复杂度 O ( ∣ S ∣ + K ) O(|S|+K) O(S+K)

Codeforces 1383B GameGame

n n n 个数,两个人轮流操作,每次可以取走其中任意一个数,每个人的最终分数为手中的数的异或和,分数大者获胜。问最终谁会获胜。
n ≤ 1 0 5 , a i ≤ 1 0 9 n\le 10^5,a_i\le 10^9 n105,ai109

从高位到低位考虑,若有偶数个数当前位为 1 1 1,则不用考虑当前位,否则仅需考虑当前位。

1 1 1 的个数模 4 4 4 1 1 1,则先手第一步取 1 1 1,之后模仿后手的行动,可知先手必胜。

若存在奇数个 0 0 0,且 1 1 1 的个数模 4 4 4 3 3 3,则先手第一步取 0 0 0,之后模仿后手的行动,可知先手必胜。

若存在偶数个 0 0 0,且 1 1 1 的个数模 4 4 4 3 3 3,则无论先手如何取,后手模仿先手的行动,可知后手必胜。

Codeforces 1383E Strange Operation

有一个长度为 n n n 01 01 01 s s s,每次可以选择一个位置 i i i,将 s i s_i si 变为 max ⁡ ( s i , s i + 1 ) \max(s_i,s_{i+1}) max(si,si+1) 并将 s i + 1 s_{i+1} si+1 删掉。问经过若干次操作后,可以得到多少种不同的序列。
n ≤ 1 0 6 n\le 10^6 n106

考虑如何让一种方案通过唯一的构造方法得到。用类似于子序列自动机的思想,不妨设走到当前位置之前至少经过了一个 1 1 1,若下一位填 1 1 1,则从最近的 1 1 1 转移过来。若填 0 0 0,如果下一个位置就是 0 0 0,就从下一个位置转移过来。否则贪心地想,必然会找一段最近且长度比当前这段 0 0 0 1 1 1 0 0 0,并跳到这一段 0 0 0 的末尾。

f i f_i fi 表示若当前走到位置 i i i,往后走能得到多少个不同的串,通过上述过程进行转移。注意若 s i s_i si 0 0 0 且以当前位为结尾最长一段 0 0 0 的个数不大于以 s n s_n sn 结尾最长一段 0 0 0 的个数, f i f_i fi 的初值才为 1 1 1,否则为 0 0 0

统计答案的时候,若 s s s 中不包含 1 1 1,则答案为 n n n,否则找到第一个 1 1 1 的位置 p p p,开头的一段 0 0 0 p p p 种情况,故 p ∗ f p p*f_p pfp 就是答案。时间复杂度 O ( n ) O(n) O(n)

Codeforces gym102392F Game on a Tree

有一棵 n n n 个节点的有根树,树上的每个节点都是白色的。两个人轮流操作,先手先选择树上的一个节点,将其染黑并放上一个硬币。接下来每次可以把硬币移动到一个白色的祖先或后代节点中,并将其染黑。不能操作者输。问先手是否必胜。
n ≤ 1 0 5 n\le 10^5 n105

结论是,在每个祖先和后代之间连一条边,若存在完美匹配,则后手必胜,反之先手必胜。因为若存在完美匹配,后手每次都可以沿着匹配边走。否则,先手先选择一个最大匹配中的未匹配点,若某时刻到达一个未匹配点,表明存在增广路,故先手可每次沿着匹配边走。

故贪心求出最大匹配并判断是否是完美匹配即可。

hdu 6849 Flower

有一棵 n n n 个点的树和 m m m 朵花,每朵花有一个权值,且形状由 x i , r i x_i,r_i xi,ri 定义,表示距离点 x i x_i xi 不超过 r i r_i ri 的点均属于这朵花。要求选出若干朵花,使得权值和尽可能大,且任意两朵花的点集不相交。
n , m ≤ 1 0 5 n,m\le 10^5 n,m105

如果令 x ⃗ \vec{x} x 表示是否选第 i i i 朵花, w ⃗ \vec{w} w 表示花的权值, A n × m A_{n\times m} An×m 表示第 i i i 个点是否属于第 j j j 朵花,这就是个线性规划问题 max ⁡ ( x ⃗ T w ⃗ ) , A x ⃗ ≤ 1 ⃗ \max(\vec{x}^T\vec{w}),\quad A\vec{x}\le \vec{1} max(x Tw ),Ax 1

对偶一下变成 min ⁡ ( y ⃗ T 1 ⃗ ) , A T y ⃗ ≥ w ⃗ \min(\vec{y}^T\vec{1}),\quad A^T\vec{y}\ge \vec{w} min(y T1 ),ATy w

等价于给每个点赋一个权值,使得每朵花包含的点权和不小于花的权值,最小化所有点的点权和。那么可以将花按深度最低的点从大到小处理,每次将权值放在深度最低的点即可。可以用动态点分治+数据结构来实现单点修改以及查询花的点集的权值和。时间复杂度 O ( n log ⁡ 2 n ) O(n\log^2n) O(nlog2n)

Codeforces 1392G Omkar and Pies

有一个长度为 n n n 的操作序列,第 i i i 个操作 ( x i , y i ) (x_i,y_i) (xi,yi) 表示交换一个长为 k k k 01 01 01 串的第 x i x_i xi 位和第 y i y_i yi 位。给定两个长为 k k k 01 01 01 s , t s,t s,t,要求在操作序列中选一段长度至少为 m m m 的连续子序列,使得对 s s s 按顺序进行其中操作后,与 t t t 相同的位置尽可能多。
m ≤ n ≤ 1 0 6 , k ≤ 20 m\le n\le 10^6,k\le 20 mn106,k20

a i , b i a_i,b_i ai,bi 分别表示把前 i i i 个操作从后往前作用在 s , t s,t s,t 上后得到的串。若 s ′ s' s 表示把编号在 [ l , r ] [l,r] [l,r] 中的操作从前往后作用在 s s s 上后得到的串,由同时交换 s ′ s' s t t t 两个相同位置后答案不变,将前 r r r 个操作从后往前分别分别作用在 s ′ , t s',t s,t 上得到 a l − 1 , b r a_{l-1},b_r al1,br,可知选择的子序列为 [ l , r ] [l,r] [l,r] 时的答案为 a l − 1 a_{l-1} al1 b r b_r br 的相同位个数。

由于 a , b a,b a,b 中每个串 1 1 1 的个数均相同,最大化相同位个数等价于最大化位置相同的 1 1 1 的个数。求出 l e f u lef_u lefu 表示最小的 j j j 满足 u u u a j a_j aj 的子集, r i g u rig_u rigu 表示最大的 j j j 满足 u u u b j b_j bj 的子集,然后找到 1 1 1 的个数最多且满足 r i g u − l e f u ≥ m rig_u-lef_u\ge m rigulefum u u u,就可以得到答案。时间复杂度 O ( k ( n + 2 k ) ) O(k(n+2^k)) O(k(n+2k))

你可能感兴趣的:(题解)