一些符号:◊ \color{blue}\Diamond ◊ 表示从中很有收获的题,□ \color{blue}\Box □ 表示差不多会,参考题解做出来的题,△ \color{blue}\triangle △ 表示完全不会,看题解才会的题,∇ \color{blue}\nabla ∇ 表示之前改的题。在题解中穿插表示具体部分。
[ARC104C] Fair Elevator (*2009)
考虑有一个区间 [ l i , r i ] [l_i,r_i] [ l i , r i ] ,钦定没有另一个区间 [ l j , r j ] [l_j,r_j] [ l j , r j ] 满足 l j < l i ∧ r j > r i l_j<l_i\wedge r_j>r_i l j < l i ∧ r j > r i 。考虑 l i + 1 l_i+1 l i + 1 位置对应的右端点,一定为 r i + 1 r_i+1 r i + 1 。于是确定了 [ l i , r i ] [l_i,r_i] [ l i , r i ] 就可以确定 [ l i + 1 , r i + 1 ] ⋯ [ r i − 1 , r i − 1 + r i − l i ] [l_i+1,r_i+1]\cdots [r_i-1,r_i-1+r_i-l_i] [ l i + 1 , r i + 1 ] ⋯ [ r i − 1 , r i − 1 + r i − l i ] 。
然后可以 dp。设 d p i dp_i d p i 为 [ 1 , i ] [1,i] [ 1 , i ] 内是否都满足。转移是枚举一个 j > i j>i j > i ,[ i , j ] [i,j] [ i , j ] 配对,然后暴力 O ( n ) O(n) O ( n ) 判断是否合法。细节多。时间复杂度 O ( n 3 ) O(n^3) O ( n 3 ) 。
[ARC104D] Multiset Mean □ \color{blue}\Box □ (*2251)
朴素 dp 是设 d p i , j , k dp_{i,j,k} d p i , j , k 表示当前选完了 [ 1 , i ] [1,i] [ 1 , i ] 内的数,选了 j j j 个,和为 k k k 的方案数。每次枚举选了几个 i i i ,复杂度为 O ( n 7 ) O(n^7) O ( n 7 ) 。
套路地,考虑先钦定一个 a v g = k avg=k a v g = k ,于是可以省去 j j j 这一维,变成 O ( n 6 ) O(n^6) O ( n 6 ) 。
然后发现其实有很多重复算的东西。考虑钦定了 a v g avg a v g 之后,把 [ 1 , n ] [1,n] [ 1 , n ] 变成了 [ − a v g + 1 , − 1 ] , 0 , [ 1 , n − a v g ] [-avg+1,-1],0,[1,n-avg] [ − a v g + 1 , − 1 ] , 0 , [ 1 , n − a v g ] 。0 0 0 不用管,乘上随意选 [ 0 , k ] [0,k] [ 0 , k ] 个的 k + 1 k+1 k + 1 种方案即可。然后要求 [ − a v g + 1 , − 1 ] [-avg+1,-1] [ − a v g + 1 , − 1 ] 和 [ 1 , n − a v g ] [1,n-avg] [ 1 , n − a v g ] 这两部分取得的数和为 0 0 0 ,□ \color{blue}\Box □ 也就是求 [ 1 , a v g − 1 ] [1,avg-1] [ 1 , a v g − 1 ] 和 [ 1 , n − a v g ] [1,n-avg] [ 1 , n − a v g ] 中选出和相同的方案数。
于是设 d p i , j dp_{i,j} d p i , j 为已经选完了 [ 1 , i ] [1,i] [ 1 , i ] ,和为 j j j 的方案数。暴力转移是 O ( n 5 ) O(n^5) O ( n 5 ) 的,加上前缀和优化多重背包之后 O ( n 4 ) O(n^4) O ( n 4 ) 可过。◊ □ \color{blue}\Diamond\Box ◊ □ 这个前缀和的方法是,设 f j = d p i , j + f j − i f_j=dp_{i,j}+f_{j-i} f j = d p i , j + f j − i 然后做。
[ARC104E] Random LIS ◊ \color{blue}\Diamond ◊ (*2824)
首先期望转 LIS 长度和除以方案数。LIS 这个东西不好刻画,但是发现 n = 6 n=6 n = 6 ,所以考虑直接枚举每个数排名,也就是枚举 X i X_i X i 离散化后的序列。
然后考虑知道这个序列之后怎么求方案数。先想一个弱化版的问题:有 m m m 个数,已知他们的排名,每个数的取值范围为 [ 1 , k ] [1,k] [ 1 , k ] ,k k k 为定值。求方案数。答案显然是 ( k m ) \binom{k}{m} ( m k ) 。
回到原问题,尝试转化成弱化版问题。注意到值域非常大(V = 1 0 9 V=10^9 V = 1 0 9 )但是 n = 6 n=6 n = 6 非常小。◊ \color{blue}\Diamond ◊ 这启示我们,◊ \color{blue}\Diamond ◊ 要不只有小部分值是有用的,要不可以把一段值放在一起算。这题显然是后者。
考虑把序列 A A A 排序后去重得到序列 B B B ,于是发现对于 ( B j − 1 , B j ] (B_{j-1},B_j] ( B j − 1 , B j ] 这个区间,能取到区间内任意一个数的 X i X_i X i 的集合相同。也就是说,我们如果知道了对于每个 ( B i − 1 , B i ] (B_{i-1},B_i] ( B i − 1 , B i ] ,哪些 X i X_i X i 在这个区间中,就可以用弱化版的方法算出每个 i i i 的方案数,最后再乘起来即可。
这里再次暴力枚举每个排名所对应的数属于哪个 ( B i − 1 , B i ] (B_{i-1},B_i] ( B i − 1 , B i ] 的 区间即可。时间复杂度远小于 O ( n 2 n ) O(n^{2n}) O ( n 2 n ) 。
[ARC104F] Visibility Sequence ◊ □ \color{blue}\Diamond\Box ◊ □ (*3213)
◊ \color{blue}\Diamond ◊ 对于序列上和某些位置的最小值最大值计数相关的,考虑一些类似笛卡尔树的 dp,更进一步,按照最大值/最小值划分区间后进行区间 dp。设 d p i , j , k dp_{i,j,k} d p i , j , k 表示 [ i , j ] [i,j] [ i , j ] 这个区间内,所有值 ≤ k \le k ≤ k 的方案数。从类似 d p i , l − 1 , k × d p l + 1 , j , k − 1 dp_{i,l-1,k}\times dp_{l+1,j,k-1} d p i , l − 1 , k × d p l + 1 , j , k − 1 转移过来。
此时有一个问题:为什么这样不会算重/漏?首先不会算漏,因为每一步都贪心地取到了最大范围,能算的情况都会算到。并且不会算重,◊ \color{blue}\Diamond ◊ 感性理解,因为从最终状态开始往下推,如果有一个 j j j 可行,不会从 j − 1 j-1 j − 1 转移过来。于是每一种 p p p 都对应了唯一一种转移过程。
但是发现 V ≤ 1 0 5 V\le 10^5 V ≤ 1 0 5 ,不过这是诈骗,◊ □ \color{blue}\Diamond\Box ◊ □ 因为发现我们只关心取值大小可能导致的大小关系,所以 a i a_i a i 可以向 n n n 取 min \min min ,只用这部分就可以凑出来需要的大小关系。时间复杂度 O ( n 4 ) O(n^4) O ( n 4 ) 。
[ARC105C] Camels and Bridge (*1964)
n = 8 n=8 n = 8 于是直接枚举排列(最近怎么做了 3 道)。考虑如果有两个限制 i , j i,j i , j 满足 l i ≥ l j , v i ≤ v j l_i\ge l_j,v_i\le v_j l i ≥ l j , v i ≤ v j 则限制 j j j 是没用的,丢掉。然后形成了 l i , v i l_i,v_i l i , v i 都单调上升的序列。
考虑从前往后依次枚举,确定第 i i i 只骆驼的位置时,枚举所有 j < i j<i j < i ,考虑区间内的体重总和,再二分出限制,确定可以放的最左的位置即可。贪心地想,每一个都尽可能往左靠是正确的。时间复杂度 O ( n ! n 2 log m ) O(n!n^2\log m) O ( n ! n 2 log m ) 。
[ARC105D] Let's Play Nim (*1871)
其实就是问能不能把每个数分配到一个集合中使得每个集合中数字和的异或和为 0 0 0 。
考虑构造。如果 n n n 为偶数,先手每次选最大的,丢到一起,记选择的序列为 A A A ,后手选的为 B B B ,则 ∑ A i ≥ ∑ B i \sum A_i\ge\sum B_i ∑ A i ≥ ∑ B i ,又 x ⊕ y ≤ x + y x\oplus y\le x+y x ⊕ y ≤ x + y ,则不管后手怎么选,他选的那一部分 ⊕ \oplus ⊕ 和都 ≤ ∑ A i \le\sum A_i ≤ ∑ A i ,取等当且仅当 a a a 中的数可以两两配对,每对内相等。能取等后手胜,否则先手。
如果 n n n 为奇数,则类似的,先手不管选什么数,后手每次选当前最大加入先手第一次放的那一堆,则一定有这一堆的和大于其它的所有数之和。所以后手必胜。
[ARC105E] Keep Graph Disconnected (*2615)
考虑如果没有第一个条件,则一共有 ( n 2 ) − m \binom{n}{2}-m ( 2 n ) − m 条边可以加,看这个数的奇偶性即可。
有了第一个条件,注意到最后一定剩下两个集合,1 1 1 号点在其中一个,n n n 在另一个。设两个集合分别为 S , T S,T S , T ,则根据 ∣ S ∣ × ∣ T ∣ |S|\times|T| ∣ S ∣ × ∣ T ∣ 的奇偶性即可得出真实胜负。接下来就看双方如何操作可以使得最后奇偶性变成怎么样。
最详细的一集:
if((n&1)){//总点数为奇数 -> 最后一定剩 01 -> 胜负情况不变
if(p&1){
puts("First");
}else{
puts("Second");
}
return;
}
if(x+y==2){//无法操作 -> 直接算影响
p-=x==2;
if(p&1){
puts("First");
}else{
puts("Second");
}
return;
}
if(p&1){//原本状态先手必胜
if((x+y)&1){//可以操作奇数次 -> 最后操作的人是先手 -> 先手希望最后不为 101
if(!u||!v){//一开始 1,n 中有一个 0 -> 先手可以控制最后 1,n 一定有一个 0 -> 先手胜
puts("First");
}else if(!y){//一开始全 1,先手先使 1 或 n 变 0 -> 后手只能把这个变为 1 否则成上面情况 -> 可以保持后手操作完后全 1 -> 先手胜
puts("First");
}else{//一开始有 0,后手可以保持操作完后中间有 0,1,n 为 1 -> 后手胜
puts("Second");
}
}else{//可以操作偶数次 -> 最后操作的是后手 -> 后手希望最后不为 000
if(!u||!v){//一开始 1,n 中有一个 0 -> 先手可以保持操作完后最后 1,n 一定都是 0 -> 先手胜
puts("First");
}else{//一开始全 1,n 都为 1,后手可以保持操作完后 1,n 都为 1 -> 后手胜
puts("Second");
}
}
}else{//原本状态后手必胜
if((x+y)&1){//可以操作奇数次 -> 最后操作的是先手 -> 先手希望最后不为 000
if(!u&&!v){//一开始 1,n 都为 0,后手可以保持操作完后 1,n 都为 0 -> 后手必胜
puts("Second");
}else{//一开始 1,n 中有一个 1,先手可以保持操作完后 1,n 都是 1 -> 先手必胜
puts("First");
}
}else{//可以操作偶数次 -> 最后操作的是后手 -> 后手希望最后不为 101
if(!u&&!v){//一开始 1,n 都为 0,后手可以保持操作完后 1,n 都为 0 -> 后手必胜
puts("Second");
}else if(!u||!v){//一开始 1,n 有一个 1,先手把其中 0 变 1
if(y==1){//中间没有 0,后手把 1,n 之一变成 0,保持操作完后中间一直全 1 -> 后手必胜
puts("Second");
}else{//中间有 0,先手保持操作完后 1,n 为 1,中间有 0 -> 先手必胜
puts("First");
}
}else{//一开始 1,n 都为 1,先手保持操作完后 1,n 为 1,中间有 0 -> 先手必胜
puts("First");
}
}
}
[ARC105F] Lights Out on Connected Graph ◊ □ \color{blue}\Diamond\Box ◊ □ (*3231)
二分图,想到黑白染色。于是对于一个点集 S S S ,枚举其染为白的子集 T T T ,则 不要求连通,S S S 的染色方案数就是 f S = ∑ T ⊆ S 2 c n t S − c n t T − c n t S ∖ T f_S=\sum\limits_{T\subseteq S}2^{cnt_S-cnt_T-cnt_{S\setminus T}} f S = T ⊆ S ∑ 2 c n t S − c n t T − c n t S ∖ T 。其中 c n t S cnt_S c n t S 表示 S S S 的导出子图的边数。
但是这是不一定联通的情况。考虑如果不限制是二分图,求连通的方案数。这个弱化问题也很难直接做,◊ \color{blue}\Diamond ◊ 于是考虑容斥。对于本题,设 d p S dp_S d p S 为 S S S 是一个连通块,染色的方案数。转移就是减去不为一个连通块的方案数,即 d p S = f S − ∑ T ⊆ S d p T f S ∖ T dp_S=f_S-\sum\limits_{T\subseteq S}dp_Tf_{S\setminus T} d p S = f S − T ⊆ S ∑ d p T f S ∖ T 。注意到这样还会算重,于是钦定 lowbit ( S ) = lowbit ( T ) \operatorname{lowbit}(S)=\operatorname{lowbit}(T) l o w b i t ( S ) = l o w b i t ( T ) 就可以了。
在做这题时的主要问题还是太过纠结边的连法。◊ □ \color{blue}\Diamond\Box ◊ □ 其实二分图的性质很好,只要对染色方式计数就行了。
[ARC106C] Solutions (*1225)
最简单的一集。发现 A 做法能取到最大值,所以 m < 0 m<0 m < 0 无解。m = 0 m=0 m = 0 用脚构造。n − m ≤ 1 n-m\le 1 n − m ≤ 1 显然无解,其他用脚构造即可。
[ARC106D] Powers (*1988)
先转换成 ∑ l = 1 n − 1 ∑ r = l + 1 n ( a l + a r ) k = ∑ l = 1 n ∑ r = 1 n ( a l + a r ) k − 2 k ∑ i = 1 n a i k \sum\limits_{l=1}^{n-1}\sum\limits_{r=l+1}^{n}(a_l+a_r)^k=\sum\limits_{l=1}^n\sum\limits_{r=1}^n(a_l+a_r)^k-2^k\sum\limits_{i=1}^na_i^k l = 1 ∑ n − 1 r = l + 1 ∑ n ( a l + a r ) k = l = 1 ∑ n r = 1 ∑ n ( a l + a r ) k − 2 k i = 1 ∑ n a i k
∑ l = 1 n ∑ r = 1 n ( a l + a r ) k \sum\limits_{l=1}^{n}\sum\limits_{r=1}^{n}(a_l+a_r)^k l = 1 ∑ n r = 1 ∑ n ( a l + a r ) k
= ∑ l = 1 n ∑ r = 1 n ∑ i = 0 k a l i a r k − i ( k i ) =\sum\limits_{l=1}^{n}\sum\limits_{r=1}^{n} \sum\limits_{i=0}^ka_l^ia_r^{k-i}\binom{k}{i} = l = 1 ∑ n r = 1 ∑ n i = 0 ∑ k a l i a r k − i ( i k )
= ∑ i = 0 k ( k i ) ∑ l = 1 n a l i ∑ r = 1 n a r k − i =\sum\limits_{i=0}^k\binom{k}{i}\sum\limits_{l=1}^{n}a_l^i\sum\limits_{r=1}^{n}a_r^{k-i} = i = 0 ∑ k ( i k ) l = 1 ∑ n a l i r = 1 ∑ n a r k − i
令 S ( x ) = ∑ i = 1 n a i x S(x)=\sum\limits_{i=1}^na_i^x S ( x ) = i = 1 ∑ n a i x ,则
a n s k = ∑ i = 0 k ( k i ) S ( i ) S ( k − i ) ans_k=\sum\limits_{i=0}^k\binom{k}{i}S(i)S(k-i) a n s k = i = 0 ∑ k ( i k ) S ( i ) S ( k − i ) 。
这几个都可以简单预处理,于是做完了。时间复杂度 O ( ( n + k ) k ) O((n+k)k) O ( ( n + k ) k ) 。
[ARC106E] Medals ◊ \color{blue}\Diamond ◊ (*2825)
分配某奖牌,◊ \color{blue}\Diamond ◊ 考虑转化成匹配,即每个人要找到 k k k 个可行位置和它匹配。◊ \color{blue}\Diamond ◊ 匹配的可行性问题,想到 Hall 定理,而且数据范围也支持我们枚举集合。
于是二分答案 a n s ans a n s ,注意到 n k ≤ a n s ≤ 4 n k nk\le ans\le 4nk n k ≤ a n s ≤ 4 n k ,于是暴力枚举每一天有哪些人在,高维前缀和算出和人的集合 S S S 有交的位置个数 f S f_S f S ,看是否有 ∀ S , f S ≥ k ∣ S ∣ \forall S,f_S\ge k|S| ∀ S , f S ≥ k ∣ S ∣ 即可。时间复杂度 O ( 2 n n log n k ) O(2^nn\log nk) O ( 2 n n log n k ) 。
第一次用 GF 推式子。
翻译一下就是这颗树每个点的度数 m ≤ a u m\le a_u m ≤ a u ,并且要额外乘上 a u m ‾ a_u^{\underline m} a u m 的权值,求所有树的权值之和。
由于是 d e g u deg_u d e g u 的限制,所以考虑 prufer 序列。考虑枚举每个点的度数为 d e g u deg_u d e g u ,变成 prufer 序列,则有 a n s = ( n − 2 ) ! ∑ ∑ d e g i = n × 2 − 2 ∏ i a i d e p i ‾ ( d e g i − 1 ) ! = ( n − 2 ) ! ∑ ∑ d e g i = n × 2 − 2 ∏ i ( a i d e g i ) d e g i ans=(n-2)!\sum\limits_{\sum deg_i=n\times2-2}\prod\limits_i\frac{a_i^{\underline{dep_i}}}{(deg_i-1)!}=(n-2)!\sum\limits_{\sum deg_i=n\times2-2}\prod\limits_i\binom{a_i}{deg_i}deg_i a n s = ( n − 2 ) ! ∑ d e g i = n × 2 − 2 ∑ i ∏ ( d e g i − 1 ) ! a i d e p i = ( n − 2 ) ! ∑ d e g i = n × 2 − 2 ∑ i ∏ ( d e g i a i ) d e g i 。可以背包 dp O ( n 2 ) O(n^2) O ( n 2 ) 解决。
但是 O ( n 2 ) O(n^2) O ( n 2 ) 显然不够,不过背包很难优化。◊ \color{blue}\Diamond ◊ 此时想到 GF(但是我一道 GF 都没做过是怎么想到的???)。设 F i ( x ) F_i(x) F i ( x ) 为第 i i i 个点对应的 GF,则有:
F i ( x ) = ∑ j ( a i j ) j x j F_i(x)=\sum_{j}\binom{a_i}{j}jx^j
F i ( x ) = j ∑ ( j a i ) j x j
= ∑ j a i ! ( a i − j ) ! j ! j x j =\sum_j\frac{a_i!}{(a_i-j)!j!}jx^j
= j ∑ ( a i − j ) ! j ! a i ! j x j
= ∑ j a i ! ( a i − j ) ! ( j − 1 ) ! x j =\sum_j\frac{a_i!}{(a_i-j)!(j-1)!}x^j
= j ∑ ( a i − j ) ! ( j − 1 ) ! a i ! x j
= a i ∑ j ( a i − 1 ) ! ( a i − j ) ! ( j − 1 ) ! x j =a_i\sum_j\frac{(a_i-1)!}{(a_i-j)!(j-1)!}x^j
= a i j ∑ ( a i − j ) ! ( j − 1 ) ! ( a i − 1 ) ! x j
= a i ∑ j ( a i − 1 j − 1 ) x j =a_i\sum_j\binom{a_i-1}{j-1}x^j
= a i j ∑ ( j − 1 a i − 1 ) x j
注意到此时 j − 1 j-1 j − 1 比较不好看,于是我们默认给每个点分配一个度数(事实上这也是必须要的),则限制变成 ∑ d e g i = n − 2 \sum deg_i=n-2 ∑ d e g i = n − 2 ,上式变成 a i ∑ j ( a i − 1 j ) x j a_i\sum_j\binom{a_i-1}{j}x^j a i ∑ j ( j a i − 1 ) x j 。
要求的即为 [ x n − 2 ] ∏ i F i ( x ) [x^{n-2}]\prod_iF_i(x) [ x n − 2 ] ∏ i F i ( x ) 。
将 F i ( x ) F_i(x) F i ( x ) 转为封闭形式即为 F i ( x ) = m ( 1 + x ) m − 1 F_i(x)=m(1+x)^{m-1} F i ( x ) = m ( 1 + x ) m − 1 。
则 ∏ i F i ( x ) = ( ∏ a i ) ( 1 + x ) ∑ a i − n \prod_iF_i(x)=(\prod a_i)(1+x)^{\sum a_i-n} ∏ i F i ( x ) = ( ∏ a i ) ( 1 + x ) ∑ a i − n 。
再转回形式幂级数为 ∏ i F i ( x ) = ( ∏ a i ) ∑ j ( ∑ a i − n j ) \prod_iF_i(x)=(\prod a_i)\sum\limits_{j}\binom{\sum a_i-n}{j} ∏ i F i ( x ) = ( ∏ a i ) j ∑ ( j ∑ a i − n ) 。
则 a n s = ( n − 2 ) ! ( ∏ a i ) ( ∑ a i − n n − 2 ) ans=(n-2)!(\prod a_i)\binom{\sum a_i-n}{n-2} a n s = ( n − 2 ) ! ( ∏ a i ) ( n − 2 ∑ a i − n ) 。O ( n ) O(n) O ( n ) 解决。
[ARC107C] Shuffle Permutation (*1223)
又是简单的一集。首先行列是相互独立的,如果第 i i i 行和第 j j j 行可以互换则连一条边,容易发现这样在同一个连通块内的行之间顺序任意,方案数为阶乘。全部乘起来就是答案。
[ARC107D] Number of Multisets □ ◊ \color{Blue}\Box\Diamond □ ◊ (*2099)
考虑将操作放到二叉树森林中。限制就是二叉树一共有 k k k 个根,n n n 个叶子,并且没有只有一个儿子的节点。合法的二叉树和可重集形成双射。
□ ◊ \color{Blue}\Box\Diamond □ ◊ 自底往上考虑每一层,类似阶梯型 dp,于是就有两种操作:在这一层新增一个点,或者在上面新增一层。第二种操作要求当前层有偶数个节点,随后每两个相邻节点都会并到一个父亲下面。
再考虑两种操作对原问题的影响:第一种显然是使元素数 + 1 +1 + 1 ,和 + 1 +1 + 1 。第二种会使全部元素对和的贡献 × 1 2 \times\frac{1}{2} × 2 1 ,也就是使和 × 1 2 \times\frac{1}{2} × 2 1 ,并要求和此时为偶数。
于是设 d p i , j dp_{i,j} d p i , j 表示前 i i i 个数,和为 j j j 的方案数。则有 d p i , j = d p i − 1 , j − 1 + d p i , j × 2 dp_{i,j}=dp_{i-1,j-1}+dp_{i,j\times 2} d p i , j = d p i − 1 , j − 1 + d p i , j × 2 。O ( n 2 ) O(n^2) O ( n 2 ) 解决。
[ARC107E] Mex Mat ∇ \color{blue}\nabla ∇ (*2604)
发现多操作几轮就一定有 a i , j = a i + 1 , j + 1 a_{i,j}=a_{i+1,j+1} a i , j = a i + 1 , j + 1 。于是暴力做个 10 10 1 0 轮后算对角线即可。证明不想写了。
[ARC107F] Sum of Abs ∇ ◊ \color{blue}\nabla\Diamond ∇ ◊ (*3130)
首先考虑,最优情况下,所有 B i < 0 B_i<0 B i < 0 的和 B i ≥ 0 B_i\ge 0 B i ≥ 0 的之间不连通,答案为 ∑ ∣ b i ∣ \sum|b_i| ∑ ∣ b i ∣ 。
但是显然很多时候取不到这个上界,◊ \color{blue}\Diamond ◊ 但是这启示我们将最后选择贡献 − B i -B_i − B i 的和 B i B_i B i 的分开,两者之间不能有连边。这相当于分成两个集合,一个是贡献 B i B_i B i 的,一个是 − B i -B_i − B i 的。◊ \color{blue}\Diamond ◊ 于是考虑最小割建模。
考虑先令 B i ≥ 0 B_i\ge 0 B i ≥ 0 的贡献 B i B_i B i ,否则贡献 − B i -B_i − B i 。如果 i i i 不在原来所属的集合,则会造成 − 2 ∣ B i ∣ -2|B_i| − 2 ∣ B i ∣ 的贡献。如果删掉 i i i 点,则会造成 − ( A i + ∣ B i ∣ ) -(A_i+|B_i|) − ( A i + ∣ B i ∣ ) 的贡献。如果 i , j i,j i , j 间有边且不在一个集合,则造成 − inf -\inf − inf 的贡献。这样连边即可。
[ARC108C] Keep Graph Connected (*1460)
感觉是更简单的一集。显然拎出来一棵生成树再随便染色就做完了。
[ARC108D] AB (*1987)
考虑推一些性质。一开始序列是 AB,不妨设 c A B = A c_{AB}=A c A B = A ,另一种情况大概是对称的。则序列会变成 AAB。此时发现,右半边仍然是 AB,怎么做都只能再增加一个 A。所以只用考虑左半边的 AA。
同时注意到这要求最终的 s n − 1 = A s_{n-1}=A s n − 1 = A 。
如果 c A A = A c_{AA}=A c A A = A ,那么最终序列就只有 AAA...AB 这一种情况。
否则,若 c B A = B c_{BA}=B c B A = B ,则可以发现,任何一个 s 1 = A , s n − 1 = A , s n = B s_1=A,s_{n-1}=A,s_n=B s 1 = A , s n − 1 = A , s n = B 的序列都可以构造出来,方法是先不管开头的 A 和结尾的 B ,每次找到最后一个连续段,先把这个连续段的第一个位置填上,再往后填。故方案数为 2 n − 3 2^{n-3} 2 n − 3 。
否则还是类似上面的,但是此时不能有两个连续的 B,因为 c A B = c B A = A c_{AB}=c_{BA}=A c A B = c B A = A 。这是一个经典计数问题,设 f n f_n f n 为长为 n n n 的序列的方案数,则 f f f 为 f 0 = 1 , f 1 = 2 f_0=1,f_1=2 f 0 = 1 , f 1 = 2 的斐波那契数列。方案数为 f n − 3 f_{n-3} f n − 3 。
c A B = B c_{AB}=B c A B = B 的答案是类似的,对称地推一下即可。
[ARC108E] Random IS ◊ \color{blue}\Diamond ◊ (*3101)
一个很重要的性质:如果已经确定 l , r l,r l , r 被选中,那么 ( l , r ) (l,r) ( l , r ) 内的期望就和其他位置无关了。于是想到进行一个区间 dp:设 d p i , j dp_{i,j} d p i , j 表示已经确定 i , j i,j i , j 选中,[ i , j ] [i,j] [ i , j ] 区间内的期望长度。转移就是枚举一个 k k k 表示 [ i , j ] [i,j] [ i , j ] 内下一个选的是 k k k ,算所有合法的 d p i , k dp_{i,k} d p i , k 和 d p k , j dp_{k,j} d p k , j 之和再除以可能数量。
做的时候有一个问题:为什么这样会把先选 l , r l,r l , r 再选一个 k > r k>r k > r 的情况算上。◊ \color{blue}\Diamond ◊ 事实上此时没有必要关注选数的顺序,只要关注选了什么就行了。于是这样是正确的。
然后发现可以 BIT 简单维护,时间复杂度 O ( n 2 log n ) O(n^2\log n) O ( n 2 log n ) 解决。
[ARC108F] Paint Tree (*2646)
这题之前自己做出来了,两次/hanx
首先有关键性质:若最大距离的同色点对为 u , v u,v u , v ,树上的任意一条直径 ( s , t ) (s,t) ( s , t ) 满足 s = u , s = v , t = u , t = v s=u,s=v,t=u,t=v s = u , s = v , t = u , t = v 其中至少一个成立。
证明:反证。若有一条直径两端点为 s , t s,t s , t 且 u , v u,v u , v 不是任何的一个 s s s 或 t t t ,s , t , u , v s,t,u,v s , t , u , v 互不相同,钦定 d i s ( s , u ) < d i s ( t , u ) dis(s,u)<dis(t,u) d i s ( s , u ) < d i s ( t , u ) ,则 c o l u = c o l t col_u\not=col_t c o l u = c o l t 。同时,因为 ( s , t ) (s,t) ( s , t ) 为直径,d i s ( u , t ) < d i s ( s , t ) dis(u,t)<dis(s,t) d i s ( u , t ) < d i s ( s , t ) ,d i s ( u , v ) < d i s ( s , v ) dis(u,v)<dis(s,v) d i s ( u , v ) < d i s ( s , v ) ,于是 c o l s = c o l v col_s\not=col_v c o l s = c o l v ,又 c o l u = c o l v col_u=col_v c o l u = c o l v ,则 c o l s = c o l t col_s=col_t c o l s = c o l t ,此时显然 s , t s,t s , t 同色且距离更远,不成立。
所以先找出任意一条直径 ( s , t ) (s,t) ( s , t ) ,有 2 n − 1 2^{n-1} 2 n − 1 种情况同色,答案为 d i s ( s , t ) dis(s,t) d i s ( s , t ) 。否则,钦定 c o l s = 0 col_s=0 c o l s = 0 ,对于每个点 u u u 考虑钦定 c o l u = 0 / 1 col_u=0/1 c o l u = 0 / 1 的时,有多少种情况使得 u u u 与一个直径端点的距离是最终答案。
预处理出 max ( d i s ( u , s ) , d i s ( u , t ) ) \max(dis(u,s),dis(u,t)) max ( d i s ( u , s ) , d i s ( u , t ) ) 然后排序后,处理出此时选这个点做答案的其中一个端点是否可行(max ( d i s ( u , s ) , d i s ( u , t ) ) ≥ max v = u min ( d i s ( v , s ) , d i s ( v , t ) ) \max(dis(u,s),dis(u,t))\ge\max_{v\not=u}\min(dis(v,s),dis(v,t)) max ( d i s ( u , s ) , d i s ( u , t ) ) ≥ max v = u min ( d i s ( v , s ) , d i s ( v , t ) ) )有多少点 v v v 是 c o l v col_v c o l v 为 0 / 1 0/1 0 / 1 都行(即为排序后排名 − 1 -1 − 1 ),然后计算即可。最后将这部分贡献 × 2 \times 2 × 2 ,因为加上 c o l s = 1 col_s=1 c o l s = 1 的情况。
[ARC109C] Large RPS Tournament (*1167)
考虑这个过程是一棵完全二叉树。你对 s + s s+s s + s 暴力做就得到了更上一层循环的字符串。这样做 m m m 遍就行了。
[ARC109D] く △ \color{blue}\triangle △ (*2394)
这种题怎么做?完全不会。
[ARC109E] 1D Reversi Builder ◊ \color{blue}\Diamond ◊ (*2661)
因为表面是一个博弈,所以先考虑分析两方的最优策略。考虑分析一些性质。
Lemma:黑白棋子构成级极长同色连续段数量不会超过 2 2 2 。
证明显然,如果在某个时刻从 2 2 2 变成了 3 3 3 ,那么一定会将一段覆盖,变成 2 2 2 个极长同色连续段。
然后,对于这种覆盖的问题,一般都是有很多位置没有用,只用考虑一些特殊的位置。对于这题,由于是两个相同位置覆盖中间的,所以尝试着只考虑每种颜色最左/右出现的位置。
容易发现,令 c i c_i c i 为列表上位置 i i i 的颜色,若 c 1 = c n c_1=c_n c 1 = c n ,那么最后全部一定都是 c 1 c_1 c 1 的棋子。证明显然。
否则不妨钦定 c 1 = 0 , c n = 1 c_1=0,c_n=1 c 1 = 0 , c n = 1 。此时我们只用关注最后一个 0 0 0 的位置 x x x 和最后一个 1 1 1 的位置 y y y 。若 x < y x<y x < y 则 x + 1 = y x+1=y x + 1 = y ,答案为 n − x + 1 n-x+1 n − x + 1 。否则手玩发现,若先取到 x x x 再取到 y y y ,那么黑方在取到 x x x 后可以直接取 x + 1 x+1 x + 1 ,因为 [ x + 1 , n ] [x+1,n] [ x + 1 , n ] 全黑,所以 x + 1 x+1 x + 1 不会再变成白色。同时 y y y 还没取,取到 y y y 后 [ y , n ] [y,n] [ y , n ] 全黑,也无法变成白色。所以最后黑棋数量为 n − y + 1 n-y+1 n − y + 1 。
那么策略就很显然了:黑方尽可能往 x x x 处靠,白方往 y y y 。直接对这个计数也是简单的:枚举起点 s s s ,分成 y < s < x , s ≤ y < x , y < x ≤ s y<s<x,s\le y<x,y<x\le s y < s < x , s ≤ y < x , y < x ≤ s 以及一些特殊情况,分别预处理一些东西然后算。作者也是这么过的。
但是你会发现这太蠢了!除了 y < s < x y<s<x y < s < x 之外,的所有情况,◊ \color{blue}\Diamond ◊ 如果将所有黑白翻转,答案就会变成 n − a n s n-ans n − a n s 。若 y < s < x y<s<x y < s < x 且 x − s = s − y x-s\not=s-y x − s = s − y 也满足这个性质。此时期望就是 n 2 \frac{n}{2} 2 n 。但是若 x − s = s − y x-s=s-y x − s = s − y ,黑方由于先手,所以一定能抢先取到 x x x 。于是期望要加上 2 x − y − 1 ( x − y + 1 ) 2 n \frac{2^{x-y-1}(x-y+1)}{2^n} 2 n 2 x − y − 1 ( x − y + 1 ) 。只用简单预处理,统计所有这样的贡献之和即可。
[ARC109F] 1D Kingdom Builder △ ◊ \color{blue}\triangle\Diamond △ ◊ (*3625)
一个非常 educational 的想法:◊ \color{blue}\Diamond ◊ 不从怎么进行操作入手,而是从最终形态入手,再根据可能的最后的形态推出最小操作次数。
考虑最后会形成若干连续段。对于每个连续段,都是先标记其中的一部分,最后再拓展成完整的连续段。
然后对第一步讨论。若填的第一个位置两边颜色不同,则一定要不断扩张直到两边相同,不妨为 0 0 0 。
然后 1 1 1 没有限制,可以填任意多个极长 1 1 1 连续段,最后填一个任意长度 1 1 1 连续段。
此时发现,若还要填 0 0 0 的连续段,那么需要将所有 1 1 1 旁边的极长 0 0 0 连续段填上,不如将上述 0 , 1 0,1 0 , 1 交换操作。于是可以填的总共有:一个两边都是 0 0 0 的 0 0 0 ,若干个极长 1 1 1 连续段,一个任意长度 1 1 1 连续段。然后再进行开头说的拓展。
于是可以 dp 了:设 d p i , 0 / 1 , 0 / 1 , 0 / 1 / 2 / 3 dp_{i,0/1,0/1,0/1/2/3} d p i , 0 / 1 , 0 / 1 , 0 / 1 / 2 / 3 表示当前处理到第 i i i 位,两边都是 0 0 0 的 0 0 0 是否使用过,任意长度 1 1 1 连续段是否使用过,当前位置不标记/标记了但是后面组成极长 1 1 1 连续段/是极长 1 1 1 连续段的一部分/选且已经组成了极长 1 1 1 连续段。讨论每一种转移即可。
[ARC110C] Exoswap (*1100)
依次找 1 , 2 , 3 , ⋯ , n 1,2,3,\cdots,n 1 , 2 , 3 , ⋯ , n 往前操作即可。
[ARC110D] Binomial Coefficient is Fun (*2078)
非常有趣的组合意义。看到上指标和要求为 m m m ,联想到范德蒙德卷积,考虑从组合意义入手看有没有很好的算法。
考虑这大概能表示成总共 m m m 个位置选 ∑ a i \sum a_i ∑ a i 个。但是发现若选的第 a 1 a_1 a 1 个和第 a 1 + 1 a_{1}+1 a 1 + 1 个位置中间有若干空位,则 b 1 b_1 b 1 不是唯一确定的。然后发现可以通过加一个分隔符的方式确定。于是就变成了不超过 m + n − 1 m+n-1 m + n − 1 个位置选 s + n − 1 s+n-1 s + n − 1 个的方案数,根据经典上指标求和,答案即为 ( m + n s + n ) \binom{m+n}{s+n} ( s + n m + n ) 。O ( s + n ) O(s+n) O ( s + n ) 暴力算组合数即可。
[ARC110E] Shorten ABC ◊ \color{blue}\Diamond ◊ (*2973)
看到这种两个字符合成一个,最后还要计数的问题,◊ \color{blue}\Diamond ◊ 可以构造一个关于 S S S 的简单函数 f ( S ) f(S) f ( S ) ,使得不管怎么操作 f ( S ) f(S) f ( S ) 都不变,然后从这个不变中寻找性质。
对于 AGC027E,这个构造的方法就是令 a → 1 , b → 2 a\to 1,b\to 2 a → 1 , b → 2 ,f ( S ) = ∑ S i m o d 3 f(S)=\sum S_i \bmod 3 f ( S ) = ∑ S i m o d 3 。一开始也想的是模意义下的东西,但是一直没想出来。直到想到异或,瞬间有如醍醐灌顶:令 a → 1 , b → 2 , c → 3 a\to 1,b\to 2,c\to 3 a → 1 , b → 2 , c → 3 ,设 f ( S ) = ⨁ S i f(S)=\bigoplus S_i f ( S ) = ⨁ S i ,这样就成功构造出来了一个不变的 f ( S ) f(S) f ( S ) 了。
于是,此时知道一个区间的异或和,就能知道这个区间可能合成什么字符。但是什么时候可以什么时候不能合成一个字符呢?显然异或和为 0 0 0 和区间长度 > 1 >1 > 1 且区间内 S i S_i S i 全相等时不行 。
其他情况是否一定可行?感性理解,可以归纳地证明:若一个区间不是上两种情况,一定就能分成两个不是上面两种区间的区间。
然后考虑进行一个最简单的 dp:设 d p i dp_i d p i 表示 S [ 1 , i ] S[1,i] S [ 1 , i ] 的方案数。求 d p i dp_i d p i 时,先枚举最后一位是什么。根据对应的异或和,就可以知道可以从哪里转移过来。
此时就会有一个结论:对于一个位置 i i i 和一个异或和 x x x ,大部分情况下只会从最大的 j j j 满足 ⨁ j < k ≤ i S k = x \bigoplus_{j<k\le i}S_k=x ⨁ j < k ≤ i S k = x 转移过来 。这是因为 [ 1 , j ] [1,j] [ 1 , j ] 的答案会包含 [ 1 , j ′ ] ( k < j ′ ) [1,j'](k<j') [ 1 , j ′ ] ( k < j ′ ) 的答案。
证明:设另一个 [ 1 , j ′ ] [1,j'] [ 1 , j ′ ] 也满足 ⨁ j ′ < k ≤ i S k = x \bigoplus_{j'<k\le i}S_k=x ⨁ j ′ < k ≤ i S k = x 。令 [ 1 , j ′ ] [1,j'] [ 1 , j ′ ] 能拼出来长为 m m m 的串 t t t ,若 t m t_m t m 和 S [ j + 1 , i ] S[j+1,i] S [ j + 1 , i ] 不全相同,根据上面的结论,t m t_m t m 拼上 S [ j + 1 , i ] S[j+1,i] S [ j + 1 , i ] 一定能合成一个和 t m t_m t m 相同的字符。否则,考虑先将 S [ j + 1 , i ] S[j+1,i] S [ j + 1 , i ] 拼到 t t t 后面,再找到从后往前第一个不同的位置记为 p p p ,则反复合并 p , p + 1 p,p+1 p , p + 1 ,一定也能得到和 t t t 相同的串。
为什么说大部分情况下呢?因为如果找不到上述 p p p 就会有问题。此时 i i i 就是会从这些 j ′ j' j ′ 转移过来的。但是发现会有这种情况当且仅当 [ 1 , j ] [1,j] [ 1 , j ] 全部相同且 [ 1 , i ] [1,i] [ 1 , i ] 不全部相同。即 j j j 是固定的。所以可以找到每一个 j ′ j' j ′ 并记录下来,后面再从这里转移。
做完了。时间复杂度 O ( n ) O(n) O ( n ) 。
[ARC110F] Esoswap (*2719)
首先可以发现,对于一个固定位置操作若干次大概是能使这个位置变成任意一个数的。于是有个猜测的做法:倒序枚举 i i i 不断对 0 0 0 操作直到 P 0 = i P_0=i P 0 = i ,然后再操作一次使 P i = i P_i=i P i = i 。
试了一下发现不太行。因为如果此时 a 0 = 0 a_0=0 a 0 = 0 就怎么也动不了了。然后发现 0 0 0 其实非常不好,但是发现,可以通过操作若干次数字 n − 1 n-1 n − 1 的方式使 P P P 循环位移,于是先不断操作 n − 1 n-1 n − 1 使 0 0 0 固定到 P n − 1 P_{n-1} P n − 1 的位置。
这一步似乎也可以通过不断操作位置 n − 1 n-1 n − 1 做到。
然后考虑依次使 n − 2 , n − 3 , ⋯ , 2 , 1 n-2,n-3,\cdots,2,1 n − 2 , n − 3 , ⋯ , 2 , 1 到 0 0 0 再到对应位置。此时又发现一个问题:当 P 0 = n − 1 P_0=n-1 P 0 = n − 1 的时候又会出问题。
但是发现这个时候好操作很多:只需要不断操作数字 n − 1 n-1 n − 1 ,使它去到还没归位的数的末尾。然后变成不断操作 1 1 1 即可。再发生一次就变成不断操作 2 2 2 ,以此类推。
最后再不断操作数字 n − 1 n-1 n − 1 ,整个 P P P 满足要求即可。
[ARC111C] Too Heavy (*1750)
若一个位置一开始就有 a i ≤ b p i a_i\le b_{p_i} a i ≤ b p i 则一定无法操作。否则按 b i b_i b i 从大到小,使 b i b_i b i 一步到 i i i 即可。
[ARC111D] Orientation ∇ \color{blue}\nabla ∇ (*2064)
若 c u < c v c_u<c_v c u < c v 则一定是 v → u v\to u v → u ,否则 c u = c v c_u=c_v c u = c v 的 u , v u,v u , v 在同一个强连通块内。因为保证有解所以 dfs 一遍即可。
[ARC111E] Simple Math 3 △ \color{blue}\triangle △ (*2541)
cnm 怎么是类欧,如果这辈子有幸学到类欧了就改这个题。
[ARC111F] Do you like query problems? ◊ □ \color{blue}\Diamond\Box ◊ □ (*3119)
考虑拆贡献:设第 i i i 次操作修改了位置 x x x 的值为 v v v ,使其在第 j j j 次操作的查询贡献。
不妨令第 i i i 操作为 min \min min ,i i i 之前最后一次 max \max max 且 v ′ > v v'>v v ′ > v 的操作位置为 k k k 。则要满足以下条件:
[ 1 , k − 1 ] [1,k-1] [ 1 , k − 1 ] 内任意。
[ k + 1 , i − 1 ] [k+1,i-1] [ k + 1 , i − 1 ] 内,所有修改操作要不与 x x x 不交,要不是 min , v ′ > v \min,v'>v min , v ′ > v 或 max , v ′ ≤ v \max,v'\le v max , v ′ ≤ v 。
[ i + 1 , j − 1 ] [i+1,j-1] [ i + 1 , j − 1 ] 内,所有修改操作要不与 x x x 不交,要不是 min , v ′ ≥ v \min,v'\ge v min , v ′ ≥ v 或 max , v ′ ≤ v \max,v'\le v max , v ′ ≤ v 。
[ j + 1 , q ] [j+1,q] [ j + 1 , q ] 内任意。
四种情况分别有的方案数为:
( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) k − 1 (\frac{(2m+1)\times n\times(n-1)}{2})^{k-1} ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) k − 1
( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) i − k − 1 (m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+m\times x\times(n-x+1)+\frac{n\times (n-1)}{2})^{i-k-1} ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + 2 n × ( n − 1 ) ) i − k − 1
( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) j − i − 1 (m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+(m+1)\times x\times(n-x+1)+\frac{n\times (n-1)}{2})^{j-i-1} ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + 2 n × ( n − 1 ) ) j − i − 1
( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) q − j (\frac{(2m+1)\times n\times(n-1)}{2})^{q-j} ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) q − j
再加上 k , i , j k,i,j k , i , j 分别的方案数:
( m − v ) × x × ( n − x + 1 ) (m-v)\times x\times(n-x+1) ( m − v ) × x × ( n − x + 1 )
x × ( n − x + 1 ) x\times(n-x+1) x × ( n − x + 1 )
x × ( n − x + 1 ) x\times(n-x+1) x × ( n − x + 1 )
所以答案即为 ∑ i = 1 q ∑ j = i + 1 q ∑ k = 1 i − 1 ∑ x = 1 n ∑ v = 0 m − 1 ( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) k − 1 × ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) i − k − 1 × ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) j − i − 1 × ( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) q − j × ( m − v ) × x × ( n − x + 1 ) × x × ( n − x + 1 ) × x × ( n − x + 1 ) × v \sum\limits_{i=1}^q\sum\limits_{j=i+1}^q\sum\limits_{k=1}^{i-1}\sum\limits_{x=1}^n\sum\limits_{v=0}^{m-1}(\frac{(2m+1)\times n\times(n-1)}{2})^{k-1}\times (m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+m\times x\times(n-x+1)+\frac{n\times (n-1)}{2})^{i-k-1}\times (m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+(m+1)\times x\times(n-x+1)+\frac{n\times (n-1)}{2})^{j-i-1}\times (\frac{(2m+1)\times n\times(n-1)}{2})^{q-j}\times (m-v)\times x\times(n-x+1)\times x\times(n-x+1)\times x\times(n-x+1)\times v i = 1 ∑ q j = i + 1 ∑ q k = 1 ∑ i − 1 x = 1 ∑ n v = 0 ∑ m − 1 ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) k − 1 × ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + 2 n × ( n − 1 ) ) i − k − 1 × ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + 2 n × ( n − 1 ) ) j − i − 1 × ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) q − j × ( m − v ) × x × ( n − x + 1 ) × x × ( n − x + 1 ) × x × ( n − x + 1 ) × v
令 f ( i ) = ( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) i − 1 , g ( i ) = ( ( 2 m + 1 ) × n × ( n − 1 ) 2 ) q − i f(i)=(\frac{(2m+1)\times n\times(n-1)}{2})^{i-1},g(i)=(\frac{(2m+1)\times n\times(n-1)}{2})^{q-i} f ( i ) = ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) i − 1 , g ( i ) = ( 2 ( 2 m + 1 ) × n × ( n − 1 ) ) q − i
A = ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) , B = ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + n × ( n − 1 ) 2 ) A=(m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+m\times x\times(n-x+1)+\frac{n\times (n-1)}{2}),B=(m\times (x-1)\times(x-2)+m\times(n-x)\times(n-x-1)+(m+1)\times x\times(n-x+1)+\frac{n\times (n-1)}{2}) A = ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + m × x × ( n − x + 1 ) + 2 n × ( n − 1 ) ) , B = ( m × ( x − 1 ) × ( x − 2 ) + m × ( n − x ) × ( n − x − 1 ) + ( m + 1 ) × x × ( n − x + 1 ) + 2 n × ( n − 1 ) )
变成 ∑ i = 1 q ∑ j = i + 1 q ∑ k = 1 i − 1 ∑ x = 1 n ∑ v = 0 m − 1 f ( k ) × A i − k − 1 × g ( j ) × B j − i − 1 × ( x × ( n − x + 1 ) ) 3 × ( m − v ) × v \sum\limits_{i=1}^q\sum\limits_{j=i+1}^q\sum\limits_{k=1}^{i-1}\sum\limits_{x=1}^n\sum\limits_{v=0}^{m-1}f(k)\times A^{i-k-1}\times g(j)\times B^{j-i-1}\times(x\times(n-x+1))^3\times (m-v)\times v i = 1 ∑ q j = i + 1 ∑ q k = 1 ∑ i − 1 x = 1 ∑ n v = 0 ∑ m − 1 f ( k ) × A i − k − 1 × g ( j ) × B j − i − 1 × ( x × ( n − x + 1 ) ) 3 × ( m − v ) × v
f ( k ) × A i − k − 1 f(k)\times A^{i-k-1} f ( k ) × A i − k − 1 和 g ( j ) × B j − i − 1 g(j)\times B^{j-i-1} g ( j ) × B j − i − 1 分别可以在确定 i , x i,x i , x 后分别可以 O ( n ) O(n) O ( n ) 推出来对于所有 i i i 的值。
变成 ∑ i = 1 q ∑ x = 1 n p r e i × s u f i × ( x × ( n − x + 1 ) ) 3 × ∑ v = 0 m − 1 ( m − v ) × v \sum\limits_{i=1}^q\sum\limits_{x=1}^npre_i\times suf_i\times(x\times(n-x+1))^3\times \sum\limits_{v=0}^{m-1}(m-v)\times v i = 1 ∑ q x = 1 ∑ n p r e i × s u f i × ( x × ( n − x + 1 ) ) 3 × v = 0 ∑ m − 1 ( m − v ) × v
以上是想的时候推的。但是很难优化。◊ □ \color{blue}\Diamond\Box ◊ □ 实际上问题在于,一开始就枚举 i , j , k i,j,k i , j , k 使得整个过程过于复杂。需要考虑更好的性质。
考虑 ∑ [ v = i ] x = ∑ [ v ≥ i ] \sum[v=i]x=\sum[v\ge i] ∑ [ v = i ] x = ∑ [ v ≥ i ] 。于是对于一个在第 i i i 次操作,包含 x x x 的询问,在其之前一定有一次 max ≥ v \max \ge v max ≥ v 的操作 j j j 。设其为最后出现的那一次。令 A = ( 2 m + 1 ) n ( n + 1 ) 2 , f ( i ) = A − m i ( n − i + 1 ) A=\frac{(2m+1)n(n+1)}{2},f(i)=A-mi(n-i+1) A = 2 ( 2 m + 1 ) n ( n + 1 ) , f ( i ) = A − m i ( n − i + 1 ) 则答案为:
∑ v = 1 m − 1 ∑ i = 1 q ∑ j = 1 i − 1 ∑ x = 1 n A j − 1 + q − i f ( x ) i − j − 1 x 2 ( n − x + 1 ) 2 ( m − v ) \sum\limits_{v=1}^{m-1}\sum\limits_{i=1}^q\sum\limits_{j=1}^{i-1}\sum\limits_{x=1}^nA^{j-1+q-i}f(x)^{i-j-1}x^2(n-x+1)^2(m-v) v = 1 ∑ m − 1 i = 1 ∑ q j = 1 ∑ i − 1 x = 1 ∑ n A j − 1 + q − i f ( x ) i − j − 1 x 2 ( n − x + 1 ) 2 ( m − v )
发现这只和 i − j i-j i − j 有关:
∑ v = 1 m − 1 ∑ l = 1 q − 1 ∑ x = 1 n A q − l − 1 f ( x ) l − 1 x 2 ( n − x + 1 ) 2 ( m − v ) ( q − l ) \sum\limits_{v=1}^{m-1}\sum\limits_{l=1}^{q-1}\sum\limits_{x=1}^nA^{q-l-1}f(x)^{l-1}x^2(n-x+1)^2(m-v)(q-l) v = 1 ∑ m − 1 l = 1 ∑ q − 1 x = 1 ∑ n A q − l − 1 f ( x ) l − 1 x 2 ( n − x + 1 ) 2 ( m − v ) ( q − l )
主意到只有 m − v m-v m − v 这一项和 v v v 有关:
m ( m − 1 ) 2 ∑ l = 1 q − 1 ∑ x = 1 n A q − l − 1 f ( x ) l − 1 x 2 ( n − x + 1 ) 2 ( q − l ) \frac{m(m-1)}{2}\sum\limits_{l=1}^{q-1}\sum\limits_{x=1}^nA^{q-l-1}f(x)^{l-1}x^2(n-x+1)^2(q-l) 2 m ( m − 1 ) l = 1 ∑ q − 1 x = 1 ∑ n A q − l − 1 f ( x ) l − 1 x 2 ( n − x + 1 ) 2 ( q − l )
把 x x x 提前:
m ( m − 1 ) 2 ∑ x = 1 n x 2 ( n − x + 1 ) 2 ∑ l = 1 q − 1 A q − l − 1 f ( x ) l − 1 ( q − l ) \frac{m(m-1)}{2}\sum\limits_{x=1}^nx^2(n-x+1)^2\sum\limits_{l=1}^{q-1}A^{q-l-1}f(x)^{l-1}(q-l) 2 m ( m − 1 ) x = 1 ∑ n x 2 ( n − x + 1 ) 2 l = 1 ∑ q − 1 A q − l − 1 f ( x ) l − 1 ( q − l )
提出来 A A A :
m ( m − 1 ) 2 A q − 2 ∑ x = 1 n x 2 ( n − x + 1 ) 2 ∑ l = 0 q − 2 ( f ( x ) A ) l ( q − l + 1 ) \frac{m(m-1)}{2}A^{q-2}\sum\limits_{x=1}^nx^2(n-x+1)^2\sum\limits_{l=0}^{q-2}(\frac{f(x)}{A})^l(q-l+1) 2 m ( m − 1 ) A q − 2 x = 1 ∑ n x 2 ( n − x + 1 ) 2 l = 0 ∑ q − 2 ( A f ( x ) ) l ( q − l + 1 )
再处理一下:
m ( m − 1 ) 2 A q − 2 ∑ x = 1 n x 2 ( n − x + 1 ) 2 ( ∑ l = 0 q − 2 ( f ( x ) A ) l ( q + 1 ) − ∑ l = 0 q − 2 ( f ( x ) A ) l l ) \frac{m(m-1)}{2}A^{q-2}\sum\limits_{x=1}^nx^2(n-x+1)^2(\sum\limits_{l=0}^{q-2}(\frac{f(x)}{A})^l(q+1)-\sum\limits_{l=0}^{q-2}(\frac{f(x)}{A})^ll) 2 m ( m − 1 ) A q − 2 x = 1 ∑ n x 2 ( n − x + 1 ) 2 ( l = 0 ∑ q − 2 ( A f ( x ) ) l ( q + 1 ) − l = 0 ∑ q − 2 ( A f ( x ) ) l l )
后面的式子前半部分直接做。后半考虑:
S = ∑ i = 0 n i x i S=\sum\limits_{i=0}^nix^i S = i = 0 ∑ n i x i
x S = ∑ i = 1 n + 1 ( i − 1 ) x i xS=\sum\limits_{i=1}^{n+1}(i-1)x^i x S = i = 1 ∑ n + 1 ( i − 1 ) x i
( x − 1 ) S = n x n + 1 − ∑ i = 1 n x i = n x n + 1 − x n + 1 − x ( x − 1 ) (x-1)S=nx^{n+1}-\sum\limits_{i=1}^nx^i=nx^{n+1}-\frac{x^{n+1}-x}{(x-1)} ( x − 1 ) S = n x n + 1 − i = 1 ∑ n x i = n x n + 1 − ( x − 1 ) x n + 1 − x
于是最后的式子就是 n x n + 1 − x n + 1 − x ( x − 1 ) x − 1 \frac{nx^{n+1}-\frac{x^{n+1}-x}{(x-1)}}{x-1} x − 1 n x n + 1 − ( x − 1 ) x n + 1 − x 。做完了。
[ARC112C] DFS Game (*1913)
答辩题。
考虑进入 u u u 所在子树后,一共要走 3 s i z u 3siz_u 3 s i z u 步才能出来。一开始显然先手能拿硬币,若进入了一个大小为 s i z v m o d 2 = 1 siz_v\bmod 2=1 s i z v m o d 2 = 1 的子树,则会交换先后手,否则不变。于是分讨:
有奇数个大小为奇数的子树,则最后一定是后手能获得若干个偶数大小子树的先手。但是其中有些贡献为负,又发现这些其实可以在前面就丢给先手。于是奇子树轮流取最大,偶子树给先手造成 ∣ w ∣ |w| ∣ w ∣ 的贡献。
有偶数个大小为奇数的子树,则所有偶子树都会被先手取到先手。直接转移。
树上 dp 即可。
[ARC112D] Skate (*2028)
我们称一个位置对于 ( x , y ) (x,y) ( x , y ) 为可达的,当且仅当从 ( x , y ) (x,y) ( x , y ) 开始,可以移动并停在这里。那么容易发现,可达是双向的且具有传递性,且所有点都可达 ( 1 , 1 ) (1,1) ( 1 , 1 ) 。于是题目的要求可以转化为,要求从 ( 1 , 1 ) (1,1) ( 1 , 1 ) 开始可以经过所有位置。
考虑若一个点能被经过,它所在的行或列一定有一个点对于 ( 1 , 1 ) (1,1) ( 1 , 1 ) 可达。进一步,发现在边不在角上的可达位置是没有意义的。然后题目要求变成每一行或 列一定有一个点对于 ( 1 , 1 ) (1,1) ( 1 , 1 ) 可达。而两个对于 ( 1 , 1 ) (1,1) ( 1 , 1 ) 可达的点直接相连的要求即为在同一行或列。于是运用经典套路,对于一个 # 或者角,将行和列相连,则答案为连通块数 − 1 -1 − 1 。
[ARC112E] Cigar Box (*2659)
首先,把 a i = i a_i=i a i = i 的序列 a a a 变成给定序列显然是难做的,考虑将目标序列进行某种映射,转化成将 a a a 变成 a i = i a_i=i a i = i 。
然后发现,对于每个数字,只有对其的最后一次操作是有用的,并且进行放到开头的操作的数字一定是某个 [ 1 , i ] [1,i] [ 1 , i ] 内的所有数,并且依次进行 i , i − 1 , i − 2 , ⋯ , 1 i,i-1,i-2,\cdots,1 i , i − 1 , i − 2 , ⋯ , 1 的操作。放到末尾的同理。
于是考虑倒推每次操作,就变成了依次对 1 , 2 , ⋯ , x 1,2,\cdots,x 1 , 2 , ⋯ , x 操作。并且对 i i i 进行操作后,以后可以任意对 i i i 操作。
则可以进行 dp:设 d p i , j , k dp_{i,j,k} d p i , j , k 表示当前到第 i i i 次操作,已经进行过放到第一的操作的为 [ 1 , j ] [1,j] [ 1 , j ] ,进行过放到末尾的为 [ k , n ] [k,n] [ k , n ] 的方案数。则转移为:d p i , j , k = d p i − 1 , j − 1 , k + d p i − 1 , j , k + 1 + ( j + n − k + 1 ) d p i − 1 , j , k dp_{i,j,k}=dp_{i-1,j-1,k}+dp_{i-1,j,k+1}+(j+n-k+1)dp_{i-1,j,k} d p i , j , k = d p i − 1 , j − 1 , k + d p i − 1 , j , k + 1 + ( j + n − k + 1 ) d p i − 1 , j , k 。而对于没有进行过操作的数,它们之间的相对位置不变,则检查它们的相对位置是否符合条件即可。
这是 O ( n 3 ) O(n^3) O ( n 3 ) 的。考虑优化状态。发现 j j j 和 k k k 无关,于是考虑记录 [ 1 , j ] [1,j] [ 1 , j ] 和 [ k , n ] [k,n] [ k , n ] 这些一共选了多少个,最后在乘上 ( j + n − k + 1 j ) \binom{j+n-k+1}{j} ( j j + n − k + 1 ) 。状态为 d p i , j dp_{i,j} d p i , j 表示前 i i i 次操作,已经进行过操作的位置有 j j j 个,则有转移:d p i , j = d p i − 1 , j − 1 + 2 j d p i − 1 , j dp_{i,j}=dp_{i-1,j-1}+2jdp_{i-1,j} d p i , j = d p i − 1 , j − 1 + 2 j d p i − 1 , j 。
最后枚举 j , k j,k j , k ,判断 [ j + 1 , k − 1 ] [j+1,k-1] [ j + 1 , k − 1 ] 是否符合条件,再乘上上述组合数,全部情况相加即可。时间复杂度 O ( n 2 ) O(n^2) O ( n 2 ) 。
咕咕咕,最近脑子不太好使啊。
[ARC112F] Die Siedler △ ◊ \color{blue}\triangle\Diamond △ ◊ (*3432)
为什么会一点思路没有呢?
首先,显然是可以做完所有 1 1 1 操作再做 2 2 2 的。然后考虑如果已知进行完 1 1 1 操作后的局面为 A A A ,A A A 最后最少剩 F ( A ) F(A) F ( A ) 张牌,则 F ( A ) F(A) F ( A ) 可以任意操作可以操作的位置直到不能操作,这样贪心求得。△ \color{blue}\triangle △ 为什么 2 2 2 操作的顺序不会影响结果?我不知道我不知道我不知道我不知道我不知道我不知道我不知道我不知道。
但是发现如果记录整个 A A A 的状态会要记录很多东西,于是尝试简化状态。△ ◊ \color{blue}\triangle\Diamond △ ◊ 考虑倒换 [ 2 , n ] [2,n] [ 2 , n ] 内的数,全部换成 1 1 1 ,具体地,一共会换出来 ∑ c i 2 i − 1 ( i − 1 ) ! \sum c_i2^{i-1}(i-1)! ∑ c i 2 i − 1 ( i − 1 ) ! 张 1 1 1 。于是就可以这样表示一个状态。并且发现可以用 2 n n ! 2^nn! 2 n n ! 张牌转一圈,变回一个 1 1 1 。
然后再考虑进行完所有 1 1 1 操作的 A A A 的 c 1 c_1 c 1 可能值是多少。设其为 T T T ,初始状态为 S S S ,每个卡包状态的 c 1 c_1 c 1 为 a i a_i a i ,选 x i x_i x i 包,则有:T = S + ∑ a i x i − y ( 2 n n ! − 1 ) T=S+\sum a_ix_i-y(2^nn!-1) T = S + ∑ a i x i − y ( 2 n n ! − 1 ) 。发现这是一个不定方程的形式,考虑裴蜀定理,于是设 g = gcd ( gcd i a i , 2 n n ! − 1 ) g=\gcd(\gcd_{i} a_i,2^nn!-1) g = g cd( g cdi a i , 2 n n ! − 1 ) ,则 S ≡ T ( m o d g ) S\equiv T\pmod{g} S ≡ T ( m o d g ) ,接下来要做的就是对于所有可能的 S < 2 n n ! S<2^nn! S < 2 n n ! ,求出 min f ( S ) \min f(S) min f ( S ) 。
△ \color{blue}\triangle △ 考虑根号分治。若 g ≤ 2 n n ! g\le \sqrt{2^nn!} g ≤ 2 n n ! ,则将问题转化成 ∑ x i 2 i − 1 ( i − 1 ) ! ≡ S ( m o d g ) \sum x_i2^{i-1}(i-1)!\equiv S\pmod{g} ∑ x i 2 i − 1 ( i − 1 ) ! ≡ S ( m o d g ) ,同余最短路解决。否则暴力枚举所有可能的 T T T ,每个贪心算。由于某些没有意义的复杂度分析所以这是对的。
[ARC113C] String Invasion (*829)
从后往前贪心即可。
[ARC113D] Sky Reflector ∇ \color{blue}\nabla ∇ (*1389)
不难发现 max a i ≤ min b i \max a_i\le \min b_i max a i ≤ min b i ,于是枚举 max a i \max a_i max a i 的值然后算即可,特判 n , m = 1 n,m=1 n , m = 1 。
[ARC113E] Rvom and Rsrev (*2789)
小清新分讨。
注意到尽可能不会删 b,所以先考虑 a 怎么删。手玩容易得到,若 c n t a m o d 2 = 0 cnta\bmod 2=0 c n t a m o d 2 = 0 或 s n = a s_n=a s n = a 则一定能只删 a 删成 bbb...bbaaa..aa 这样的形式,由于 b 数量不变,a 数量每次减少 2 2 2 ,问题就变成了如何最小化步数。
这种问题一般会从连续段数量上看。于是考虑什么样的操作会减少 b 连续段数量。考虑若 s i − 1 = s j − 1 = b s_{i-1}=s_{j-1}=b s i − 1 = s j − 1 = b ,则操作 ( i , j ) (i,j) ( i , j ) 后这两段会并在一起,于是用一次操作能减少一段。还有呢?若 s i − 1 = s i + 1 = s j − 1 = s j + 1 = b s_{i-1}=s_{i+1}=s_{j-1}=s_{j+1}=b s i − 1 = s i + 1 = s j − 1 = s j + 1 = b ,一次减少两段。于是先尽可能操作后者,剩下操作前者,次数容易算出。这里有一个特殊情况,若 s 1 = a s_1=a s 1 = a ,那么应该视作 s 0 = b s_0=b s 0 = b ,再判断连续段数。
然后考虑剩下的情况。这些情况删完之后中间一定会剩一个 a,设其在 p p p ,则可以操作 ( p − 1 , n ) (p-1,n) ( p − 1 , n ) 将这个 1 1 1 换到最后。此时又有两种特殊情况:
只有开头 s 1 = a s_1=a s 1 = a 的一段。此时开头一定会剩一个 a。
只有结尾 s n − 1 = a s_{n-1}=a s n − 1 = a 或 s n − 2 = a s_{n-2}=a s n − 2 = a 的一段,此时容易发现对其进行上面的操作反而更劣,于是消掉所有其它的 a 然后不操作。
剩下的情况就转化成,先同上用尽可能少的操作消成两个连续段,再进行一次操作把 a 换到后面。此时又有最后一种特殊情况:若除了 s i − 1 = s i + 1 = s j − 1 = s j + 1 = b s_{i-1}=s_{i+1}=s_{j-1}=s_{j+1}=b s i − 1 = s i + 1 = s j − 1 = s j + 1 = b 的情况只有 s 1 = a s_1=a s 1 = a 对应的开头一段,容易发现是需要用一个 s i − 1 = s i + 1 = b s_{i-1}=s_{i+1}=b s i − 1 = s i + 1 = b 的位置消掉开头的。
然后就做完了。
[ARC113F] Social Distance △ ◊ \color{blue}\triangle\Diamond △ ◊ (*3990)
不会积分,改不了,但是感觉大概懂了。
先考虑如果只是整数怎么做。考虑经典求期望套路 E ( x ) = ∑ P ( x ≥ i ) E(x)=\sum P(x\ge i) E ( x ) = ∑ P ( x ≥ i ) ,转化成每两个距离都大于 l i m lim l i m 的概率。□ \color{blue}\Box □ 注意到此时x_i形如每个变量有个取值范围,大小有限制,于是尝试转化成经典模型,要求 a i ∈ [ x i − 1 − ( i − 1 ) l i m , x i − ( i − 1 ) l i m ] a_i\in [x_{i-1}-(i-1)lim,x_i-(i-1)lim] a i ∈ [ x i − 1 − ( i − 1 ) l i m , x i − ( i − 1 ) l i m ] 且 a i a_i a i 不减。这是类似上面做过的 [ARC104E] Random LIS 的模型(当然这题做法就不能指数了)。
考虑离散化后设 d p i , j , k dp_{i,j,k} d p i , j , k 表示考虑到第 i i i 段值域区间,当前为第 j j j 个变量,这段区间已经选了 k k k 个,转移分当前变量在/不在当前区间并处理概率即可。
然后拓展到实数,□ ◊ \color{blue}\Box\Diamond □ ◊ 注意到这个方程只和每个 [ x i − 1 − ( i − 1 ) l i m , x i − ( i − 1 ) l i m ] [x_{i-1}-(i-1)lim,x_i-(i-1)lim] [ x i − 1 − ( i − 1 ) l i m , x i − ( i − 1 ) l i m ] 之间大小关系有关,一共 O ( n 2 ) O(n^2) O ( n 2 ) 种大小关系,△ ◊ \color{blue}\triangle\Diamond △ ◊ 并且对于每种大小关系,离散化后区间的真实长度 l e n len l e n 是一个关于 x x x 的一次函数,所以最后结果也会是一个关于 x x x 的多项式,做一些积分相关即可。不会了。/kk
也是缓慢地搞定了 10 rounds。
[ARC114C] Sequence Scores (*2056)
首先分析,如果现在已知 A A A ,怎么求 f ( A ) f(A) f ( A ) 。首先贪心地想,设依次操作 v i v_i v i ,若 v i + 1 < v i v_{i+1}<v_i v i + 1 < v i ,那么换成先操作 v i v_i v i 再 v i + 1 v_{i+1} v i + 1 一定不劣,因为可能的结果后者包含前者。于是一定是按 v v v 从小到大操作。
然后发现,对于一个 a i = a j = x a_i=a_j=x a i = a j = x ,若 ∃ k ∈ ( i , j ) , a k < x \exists k\in(i,j),a_k<x ∃ k ∈ ( i , j ) , a k < x ,则无法用一次操作同时使 a i , a j a_i,a_j a i , a j 满足要求,否则会影响中间已经确定的数。同时,若 a i a_i a i 这个数是第一次出现,显然也要一次操作。
然后拆开算贡献。对于第一种情况,考虑枚举 a i = k a_i=k a i = k 上一次出现的位置为 j j j ,则 ( i , j , k ) (i,j,k) ( i , j , k ) 产生贡献的要求有:( i , j ) (i,j) ( i , j ) 中没有 k k k 且 ∃ p ∈ ( i , j ) , a p < k \exists p\in(i,j),a_p<k ∃ p ∈ ( i , j ) , a p < k 。计算方案数,考虑算没有 k k k 的方案减去全 > k >k > k 的方案,为 ( ( m − 1 ) i − j − 1 − ( m − k ) i − j − 1 ) m n − i + j − 1 ((m-1)^{i-j-1}-(m-k)^{i-j-1})m^{n-i+j-1} ( ( m − 1 ) i − j − 1 − ( m − k ) i − j − 1 ) m n − i + j − 1 ,后面的 m m m 是其他位置任取的方案数。于是方案数为:
∑ i = 1 n ∑ k = 1 m ∑ j = 1 i − 1 ( ( m − 1 ) i − j − 1 − ( m − k ) i − j − 1 ) m ( n − ( i − j + 1 ) ) \sum\limits_{i=1}^n\sum\limits_{k=1}^m\sum\limits_{j=1}^{i-1}((m-1)^{i-j-1}-(m-k)^{i-j-1})m^{(n-(i-j+1))}
i = 1 ∑ n k = 1 ∑ m j = 1 ∑ i − 1 ( ( m − 1 ) i − j − 1 − ( m − k ) i − j − 1 ) m ( n − ( i − j + 1 ) )
然后推式子。发现只和 i − j i-j i − j 有关:
= ∑ i = 1 n − 1 ∑ k = 1 m ( ( m − 1 ) i − 1 − ( m − k ) i − 1 ) ( n − i ) m n − i − 1 =\sum\limits_{i=1}^{n-1}\sum\limits_{k=1}^m((m-1)^{i-1}-(m-k)^{i-1})(n-i)m^{n-i-1}
= i = 1 ∑ n − 1 k = 1 ∑ m ( ( m − 1 ) i − 1 − ( m − k ) i − 1 ) ( n − i ) m n − i − 1
改变枚举顺序。
= ∑ k = 1 m ∑ i = 1 n − 1 ( ( m − 1 ) i − 1 ( n − i ) m n − i − 1 − ( m − k ) i − 1 ( n − i ) m n − i − 1 ) =\sum\limits_{k=1}^m\sum\limits_{i=1}^{n-1}((m-1)^{i-1}(n-i)m^{n-i-1}-(m-k)^{i-1}(n-i)m^{n-i-1})
= k = 1 ∑ m i = 1 ∑ n − 1 ( ( m − 1 ) i − 1 ( n − i ) m n − i − 1 − ( m − k ) i − 1 ( n − i ) m n − i − 1 )
对于 x i y n − i x^iy^{n-i} x i y n − i 状物,有个 trick 是提出来 y n y^n y n 变成 y n ( x y ) i y^n(\frac xy)^i y n ( y x ) i 。
= m n − 2 ∑ k = 1 m ∑ i = 1 n − 1 ( ( m − 1 m ) i − 1 ( n − i ) − ( m − k m ) i − 1 ( n − i ) ) =m^{n-2}\sum\limits_{k=1}^m\sum\limits_{i=1}^{n-1}((\frac{m-1}{m})^{i-1}(n-i)-(\frac{m-k}{m})^{i-1}(n-i))
= m n − 2 k = 1 ∑ m i = 1 ∑ n − 1 ( ( m m − 1 ) i − 1 ( n − i ) − ( m m − k ) i − 1 ( n − i ) )
= m n − 2 ( n ∑ k = 1 m ∑ i = 1 n − 1 ( ( m − 1 m ) i − 1 − ( m − k m ) i − 1 ) − ∑ k = 1 m ∑ i = 1 n − 1 ( i ( m − 1 m ) i − 1 − i ( m − k m ) i − 1 ) ) =m^{n-2}(n\sum\limits_{k=1}^m\sum\limits_{i=1}^{n-1}((\frac{m-1}{m})^{i-1}-(\frac{m-k}{m})^{i-1})-\sum\limits_{k=1}^m\sum\limits_{i=1}^{n-1}(i(\frac{m-1}{m})^{i-1}-i(\frac{m-k}{m})^{i-1}))
= m n − 2 ( n k = 1 ∑ m i = 1 ∑ n − 1 ( ( m m − 1 ) i − 1 − ( m m − k ) i − 1 ) − k = 1 ∑ m i = 1 ∑ n − 1 ( i ( m m − 1 ) i − 1 − i ( m m − k ) i − 1 ) )
发现前半部分是等比数列形式,可以 O ( 1 ) O(1) O ( 1 ) 算。后半形似 ∑ ( i + 1 ) x i \sum (i+1)x^i ∑ ( i + 1 ) x i ,对于这种的处理,令 A = ∑ i = 0 n ( i + 1 ) x i , x A = ∑ i = 1 n + 1 i x i A=\sum\limits_{i=0}^n (i+1)x^i,xA=\sum\limits_{i=1}^{n+1} ix^i A = i = 0 ∑ n ( i + 1 ) x i , x A = i = 1 ∑ n + 1 i x i ,相减得 ( x − 1 ) A = ( n + 1 ) x n + 1 − ∑ i = 0 n x i (x-1)A=(n+1)x^{n+1}-\sum\limits_{i=0}^nx^i ( x − 1 ) A = ( n + 1 ) x n + 1 − i = 0 ∑ n x i ,结合等比数列也是 O ( 1 ) O(1) O ( 1 ) 。
于是 令 f ( x , n ) = ∑ i = 0 n x i = x n + 1 − 1 x − 1 , g ( x , n ) = ∑ i = 0 n ( i + 1 ) x i = ( n + 1 ) x n + 1 − f ( x , n ) x − 1 f(x,n)=\sum\limits_{i=0}^nx^i=\frac{x^{n+1}-1}{x-1},g(x,n)=\sum\limits_{i=0}^{n}(i+1)x^i=\frac{(n+1)x^{n+1}-f(x,n)}{x-1} f ( x , n ) = i = 0 ∑ n x i = x − 1 x n + 1 − 1 , g ( x , n ) = i = 0 ∑ n ( i + 1 ) x i = x − 1 ( n + 1 ) x n + 1 − f ( x , n ) ,则有:
= m n − 2 ( n ∑ k = 1 m ( f ( m − 1 m , n − 2 ) − f ( m − k m , n − 2 ) ) − ∑ k = 1 m ( g ( m − 1 m , n − 2 ) − g ( m − k m , m − 2 ) ) ) =m^{n-2}(n\sum\limits_{k=1}^m(f(\frac{m-1}{m},n-2)-f(\frac{m-k}{m},n-2))-\sum\limits_{k=1}^m(g(\frac{m-1}{m},n-2)-g(\frac{m-k}{m},m-2)))
= m n − 2 ( n k = 1 ∑ m ( f ( m m − 1 , n − 2 ) − f ( m m − k , n − 2 ) ) − k = 1 ∑ m ( g ( m m − 1 , n − 2 ) − g ( m m − k , m − 2 ) ) )
此时 O ( n log n ) O(n\log n) O ( n log n ) 已经是简单的,至于 O ( n ) O(n) O ( n ) ,容易发现需要快速幂的只有 x n − 1 x^{n-1} x n − 1 ,线性筛预处理,再预处理一些逆元即可。
后面部分的式子比较简单,为 ∑ i = 1 n ∑ k = 1 m ( m − 1 ) i − 1 m n − i \sum\limits_{i=1}^n\sum\limits_{k=1}^m(m-1)^{i-1}m^{n-i} i = 1 ∑ n k = 1 ∑ m ( m − 1 ) i − 1 m n − i 。容易发现与 k k k 无关,于是动态维护后面两个东西即可。
[ARC114D] Moving Pieces on Line ◊ \color{blue}\Diamond ◊ (*2723)
先尝试分析一些简单的性质。
首先,每个棋子可以视作只往一个方向移动若干距离,因为这个操作相当于原本边权为 0 0 0 ,每走一步将边权 ⊕ 1 \oplus1 ⊕ 1 。显然走回头路会抵消掉之前走的。也就是说,可以将问题转化成,对于每个 a i a_i a i 选择一个 b i b_i b i ,将 [ a i , b i ] [a_i,b_i] [ a i , b i ] 间的边权 ⊕ 1 \oplus 1 ⊕ 1 ,使得最后的边权序列满足要求。
其次,棋子移动的终点一定是原本的某个 a i a_i a i 或者 x i x_i x i 。否则,可以通过调整变成这种情况并且不劣。称这些点为关键点。
此时其实可以写出一个 O ( n 4 ) O(n^4) O ( n 4 ) dp:设 d p i , j , k , l dp_{i,j,k,l} d p i , j , k , l 表示包含第 i i i 个关键点的区间,设当前位置为 x x x ,有 j j j 个的 a i < x a_i<x a i < x ,k k k 个的 a i > x a_i>x a i > x ,还有 l l l 个没有确定。转移甚至可能还不是 O ( 1 ) O(1) O ( 1 ) 的,但是显然不对。
先尝试优化,可能会根据想到进行一些分讨,但是看着就不太行。于是再考虑进行转化。◊ \color{blue}\Diamond ◊ 仔细想想,区间异或,只有若干个关键点,会想到?对了,差分 !
考虑把操作和限制都转化成差分数组上的。操作变成,每次选择 a i a_i a i 和任意一个位置 ⊕ 1 \oplus 1 ⊕ 1 ,限制变成,要求最后若干个位置是 1 1 1 。于是可以得到还有若干个位置需要 ⊕ 1 \oplus1 ⊕ 1 ,而对于若干个可以任意选择的位置,要不两两匹配,要不找一个还需要 1 1 1 的位置匹配。
于是把 a i a_i a i 和需要 1 1 1 的位置放在一起排序后 dp:设 d p i , j , 0 / 1 dp_{i,j,0/1} d p i , j , 0 / 1 表示到了第 i i i 个位置,当前还有 j j j 个没有匹配,并且没有匹配的是 a i a_i a i /需要 1 1 1 的位置。容易证明两种不会同时没有匹配,因为这样的话在前面就先匹配上更优。转移是 trivial 的,使用一些费用提前计算的技巧即可。
于是时间 O ( n 2 ) O(n^2) O ( n 2 ) ,空间滚动后 O ( n ) O(n) O ( n ) 通过了这题。
[ARC114E] Paper Cutting 2 ∇ \color{blue}\nabla ∇ (*2514)
首先可以把切开视作缩小边界但不去掉。然后考虑一个序列 p p p 表示所有的线依次什么时候被操作。因为被操作两次显然没有意义所以这是个类似排列的东西。
然后根据期望的线性性,分开每条线算贡献。考虑如果是两个黑点围成的矩形左边的线,如果它在 p p p 中的位置在它左边的所有线以及会导致结束的线之前,则会对答案产生 1 1 1 的贡献。设这些线共有 c n t cnt c n t 条,则只考虑这 c n t cnt c n t 条加上当前考虑的一条线在 p p p 中的相对顺序,于是该线位置最前的概率为 1 c n t + 1 \frac{1}{cnt+1} c n t + 1 1 。则答案为 ∑ 1 c n t + 1 \sum \frac{1}{cnt+1} ∑ c n t + 1 1 。
[ARC114F] Permutation Division (*3545)
板刷 ARC 就是为了做出这种题。/zhq
先手玩一下,看看两边会如何操作。首先,设分成第 i i i 个段的第 j j j 位为 b i , j b_{i,j} b i , j ,那么对方肯定会贪心地把 b i , 1 b_{i,1} b i , 1 最大的 i i i 段给放到开头,而所有的 b i , 1 b_{i,1} b i , 1 不相同,所以设最后对方放的第 i i i 个段的第 j j j 位为 c i , j c_{i,j} c i , j ,则 c 1 , 1 ≥ k c_{1,1}\ge k c 1 , 1 ≥ k 。所以我方就要贪心地,使 b i , 1 b_{i,1} b i , 1 取到当前剩下的最小的 k k k 个数。
但是不一定能取到,因为会发现,如果当前 a 1 = x a_1=x a 1 = x ,则一定存在一个 b i , 1 = x b_{i,1}=x b i , 1 = x 。若此 x x x 比剩下最小的 k k k 个数中最大的还大,则一定有 c 1 , 1 = x c_{1,1}=x c 1 , 1 = x ,剩下的 c i , 1 c_{i,1} c i , 1 依次为剩下最小的 k − 1 k-1 k − 1 个数。
并且还有一个性质,就是答案的字典序不会比原序列小,否则对方就直接不操作。
分析出来这些就考虑怎么一段一段取,每取一段变成一个子问题。设上面两种情况分别为情况一和二,容易发现,如果出现上面的第一种情况,则剩下序列的开头位置字典序一定会变小。于是贪心地,我们就要尽可能使用情况二,剩下不能为情况二的再用一。
再来分析一下如何能取到情况二。设当前段开头为 x x x ,下一段开头在 i i i 取 y y y ,还要取 k k k 段。首先有 x > y x>y x > y ,否则对方会选择把 y y y 换到前面。并且有 ∑ j > i [ a j < y ] ≥ k \sum_{j>i}[a_j<y]\ge k ∑ j > i [ a j < y ] ≥ k ,否则剩下的一定会有段头 > y >y > y 的。
然后还需要做一个观察:如果确定了 y y y ,那么 y y y 之前取的组的数量越多越好。这是因为,根据上面的结论,若剩下还没取的有 k k k 段,则下一个组的段头就是剩下数中第 k k k 小的,显然 k k k 越小越好。同时,我们现在只确定了 y y y ,没有确定段的右端点。但也容易发现,这个右端点越大越好。这是因为设下一段开头位置为 p p p ,则 p p p 位置的字典序一定发生变化,于是这个位置越往后越好。
此时就可以开始处理了。首先对于 x > y x>y x > y 的条件,又是越多越好且没有其他限制,于是发现,令情况二最后一段的段头位置为 i i i ,则情况二取到的段数就是,钦定开头为 a 1 a_1 a 1 ,结尾为 a i a_i a i 的最长下降子序列长度。找完 i i i 后要找情况一的第一段的段头,设还要取 k k k 段,这个位置就是最大的 j j j ,满足 ∑ l > j [ a l < a i ] ≥ k \sum_{l>j}[a_l<a_i]\ge k ∑ l > j [ a l < a i ] ≥ k 。
于是就依次维护这两部分。第一部分显然简单 SGT 维护。第二部分,将第一部分处理出来的每个 i i i 和 k k k 离线下来,考虑按照 a i a_i a i 从小到大排序,依次标记每个位置 a i a_i a i 的位置为 1 1 1 ,SGT 上二分找到最后一个后缀和 ≥ k \ge k ≥ k 的位置 p p p ,若 p > i p>i p > i 则更新答案。令答案为一个二元组 ( x , y ) (x,y) ( x , y ) 表示 [ x , n ] [x,n] [ x , n ] 的分段用情况一,还要分 y y y 段。于是最后答案就是在 x x x 最大的基础上,使 y y y 尽可能小的 ( x , y ) (x,y) ( x , y ) 。最后输出答案就直接输出 [ 1 , x − 1 ] [1,x-1] [ 1 , x − 1 ] 的 a i a_i a i 以及对 [ x , n ] [x,n] [ x , n ] 做情况一的结果即可。时间复杂度 O ( n log n ) O(n\log n) O ( n log n ) ,结束。
对的,感觉这题就是常规的贪心,分析性质,甚至没有 Diamond。
[ARC115C] ℕ Coloring (*706)
从小到大模拟即可。
[ARC115D] Odd Degree □ ◊ \color{blue}\Box\Diamond □ ◊ (*2325)
挺 tricky 的,没想出来。
□ ◊ \color{blue}\Box\Diamond □ ◊ 对于这种异或为 1 1 1 或者和奇偶性相关的,以及其他一些类型计数题目,会有很多条件无用,因为只要其中一部分条件就可以调整出一个合法的解。
对于这题,考虑拎出一棵生成树,钦定其中 k k k 个点度数为奇数。容易发现,对于每一种非树边是否取的方案,都会有一种选取树边的方案使得满足要求。具体地,从下往上,若当前点不符合要求,则选取往父亲的树边,否则不选,这样一定有解。于是方案数为 ( n k ) 2 m − n + 1 \binom nk2^{m-n+1} ( k n ) 2 m − n + 1 。
对于有多个连通块的进行一个背包即可。
[ARC115E] LEQ and NEQ (*2363)
很套路的题,但是有意思就有意思在不同的解法挺多的。
Sol 1
考虑容斥,设 d p i dp_i d p i 表示 [ 1 , i ] [1,i] [ 1 , i ] 的答案,枚举 [ j , i ] [j,i] [ j , i ] 内 x i x_i x i 全部相同,则有 d p i = ∑ ( − 1 ) i − j d p j − 1 min j ≤ k ≤ i a k dp_{i}=\sum (-1)^{i-j}dp_{j-1}\min_{j\le k\le i}a_k d p i = ∑ ( − 1 ) i − j d p j − 1 min j ≤ k ≤ i a k 。一个很套路的做法是枚举中间最小值分治,若 i − l i < r i − i i-l_i<r_i-i i − l i < r i − i 则枚举左边,差分更新右边,否则枚举右边,用左边的前缀和更新。O ( n log n ) O(n\log n) O ( n log n ) 。
Sol 2
还是同样的 dp 式子,但是发现确定 min \min min 的位置后只和一段的 dp 值乘上 ( − 1 ) k (-1)^k ( − 1 ) k 有关,于是维护一个单调栈,对于里面的每个元素 b i b_i b i 维护 ( b i − 1 , b i ] (b_{i-1},b_i] ( b i − 1 , b i ] 内可能的 ( − 1 ) j d p j − 1 (-1)^jdp_{j-1} ( − 1 ) j d p j − 1 之和记作 c i c_i c i 与 ∑ c i a i \sum c_ia_i ∑ c i a i ,每次新往最后加入一个元素就合并若干段并动态维护那几个值。O ( n ) O(n) O ( n ) 。
Sol 3
考虑直接 dp,设 d p i , j dp_{i,j} d p i , j 表示第 i i i 位选 j j j ,则 d p i , j = ∑ d p i − 1 , k − d p i − 1 , j dp_{i,j}=\sum dp_{i-1,k}-dp_{i-1,j} d p i , j = ∑ d p i − 1 , k − d p i − 1 , j 。于是要支持区间加,区间乘,线段树维护即可。O ( n log n ) O(n\log n) O ( n log n ) 。
[ARC115F] Migration (*3336)
考虑如果当前有一个状态 A A A 能在和不超过 l i m lim l i m 的前提下到达一个状态 B B B ,则 B B B 在同样条件的前提下也能到达 A A A 。
于是对于初始状态 S S S ,会发现最优策略一定是先把和变得尽可能小,达到状态 R R R ,以此让某些要经过很大值的点通过,然后再变成结束状态 T T T 。
如果我们想知道一个状态 A A A 在操作过程中和不超过 l i m lim l i m 的前提下,和尽可能小的状态 B B B 是简单的。考虑记录 d i , j d_{i,j} d i , j 表示一个棋子从 i i i 点移动到 j j j 点,其他不动,会使和 s s s 增加多少。
容易发现我们只会把棋子从 h i h_i h i 大的移动到 h i h_i h i 小的。同时,若 d i s i , j < d i s i , k dis_{i,j}<dis_{i,k} d i s i , j < d i s i , k ,先移动到 j j j 一定不劣。于是对于每个位置 u u u ,下一次会移动到的点 t o u to_u t o u 是固定的,只需要每次找可移动的点移动即可。一共会移动 O ( n 2 ) O(n^2) O ( n 2 ) 次,使用优先队列优化后这一部分是 O ( n 2 log n ) O(n^2\log n) O ( n 2 log n ) 的。
但是此时又发现一个问题:求 R R R 是否能到达 T T T 是困难的。但是由于一开始给出的结论,考虑对于 T T T 求出它能到达的和最小的状态 R ′ R' R ′ ,于是只用求 R R R 是否能到达 R ′ R' R ′ 。
这个判断是简单的,容易发现,若 R R R 和 R ′ R' R ′ 中两个对应的棋子的 h h h 不同,则一定无解。因为若 R R R 中的 h x h_x h x 小于 R ′ R' R ′ 中的 h y h_y h y ,那么说明这个 x x x 无法到达 y y y ,否则 R R R 会变化。于是只用判断此时 R R R 的和 s u m sum s u m 是否有 s u m + max d i s x , y ≤ l i m sum+\max dis_{x,y}\le lim s u m + max d i s x , y ≤ l i m 即可。
同时这个 l i m lim l i m 显然是可二分的,所以二分答案,复杂度为 O ( n 2 log V log n ) O(n^2\log V\log n) O ( n 2 log V log n ) 。
然而此时大概率还无法通过。于是卡卡常,首先是发现设 S , T S,T S , T 的和分别为 s , t s,t s , t ,则二分边界可以设成 l = max ( s , t ) , r = l + 1 0 9 l=\max(s,t),r=l+10^9 l = max ( s , t ) , r = l + 1 0 9 。同时,发现 at 的 c++17 比 c++20 要快。于是 3900ms 通过。
话说好像不用二分,就不卡常了。
[ARC116C] Multiple Sequences (*1468)
方案数显然只与序列中出现了多少个不同的数有关,而且这显然是 O ( log n ) O(\log n) O ( log n ) 级别的,于是 dp 出每种数量的情况数即可。
[ARC116D] I Wanna Win The Game (*1718)
显然拆位后变成每一位都选偶数个 1 1 1 ,于是 dp 记录当前和为 j j j 的方案数即可,每次转移枚举这层选多少然后乘组合数。
首先显然可以二分,然后就变成求最少要用多少个关键点。贪心地,dfs 从底往上做,显然是直到不得不放了才放一个关键点。于是设 d u d_u d u 表示 u u u 离下面最近的关键点的距离,注意一个 u u u 的两个儿子 v 1 , v 2 v_1,v_2 v 1 , v 2 之间的 d d d 可能会互相影响。
[ARC116F] Deque Game □ ◊ \color{blue}\Box\Diamond □ ◊ (*3125)
◊ \color{blue}\Diamond ◊ 首先是之前见过的结论。若 k = 1 k=1 k = 1 ,设 A 先手,p = ⌊ n + 1 2 ⌋ p=\left\lfloor\frac{n+1}{2}\right\rfloor p = ⌊ 2 n + 1 ⌋ ,若 n n n 为奇数则最后剩下 min ( a p , max ( a p − 1 , a p + 1 ) ) \min(a_p,\max(a_{p-1},a_{p+1})) min ( a p , max ( a p − 1 , a p + 1 ) ) ,否则剩下 max ( a p , a p + 1 ) \max(a_p,a_{p+1}) max ( a p , a p + 1 ) 。后手类似。□ ◊ \color{blue}\Box\Diamond □ ◊
但是这里还能引申出一个很有意义的结论:当 n n n 为奇数时都是后手优势,否则先手优势。
于是对于这题,对于 n n n 为奇数的序列,两边都不会去碰,否则,两边会轮流选择 n n n 为偶数的序列,进行一次操作变成奇数的。设这样操作后这个序列能变成的最大结果为 x x x ,最小为 y y y ,则按照 x − y x-y x − y 排序,两边依次选。最后再求出所有最后得到的数即可。
[ARC117C] Tricolor Pyramid (*1768)
估计是把 ARC110E 的不可行做法搞过来出了个题。考虑 ABC 分别为 012。则每次操作会产生一个 − ( x + y ) m o d 3 -(x+y)\bmod 3 − ( x + y ) m o d 3 。但是发现仍然不能暴力维护,于是考虑对于每个位置计算贡献。正负性显然是确定的,系数还要乘上一个组合数 m o d 3 \bmod 3 m o d 3 ,lucas 搞一搞就行。
[ARC117D] Miracle Tree ∇ ◊ \color{blue}\nabla\Diamond ∇ ◊ (*2115)
好离谱,感觉这个题给我一年我都不一定做得出来……考虑将每个点放入一个序列中,发现只要相邻两个满足条件,全部条件也就满足。因为 d i s ( i , j ) + d i s ( j , k ) ≥ d i s ( i , k ) dis(i,j)+dis(j,k)\ge dis(i,k) d i s ( i , j ) + d i s ( j , k ) ≥ d i s ( i , k ) 。于是全部取等得到 E n = ∑ d i s ( a i , a i + 1 ) + 1 ≤ 2 ( n − 1 ) − d i s ( a 1 , a n ) + 1 E_n=\sum dis(a_i,a_{i+1})+1\le 2(n-1)-dis(a_1,a_n)+1 E n = ∑ d i s ( a i , a i + 1 ) + 1 ≤ 2 ( n − 1 ) − d i s ( a 1 , a n ) + 1 。显然也可以取等,于是就让 d i s ( a 1 , a n ) dis(a_1,a_n) d i s ( a 1 , a n ) 取 max \max max ,为直径。
感觉这种只找相邻两个的关系的技巧还挺多见的,反正最近被一个纸张题创了。
[ARC117E] Zero-Sum Ranges 2 ∇ \color{blue}\nabla ∇ (*3166)
若已知最终序列,考虑如何快速求 ∑ l ≤ i ≤ r a i = 0 \sum\limits_{l\le i\le r} a_i=0 l ≤ i ≤ r ∑ a i = 0 的个数。显然可以求出前缀和数组 s s s ,则设 c i c_i c i 为 ∑ j s j = i \sum_js_j=i ∑ j s j = i ,则个数为 ∑ ( c i 2 ) \sum \binom{c_i}{2} ∑ ( 2 c i ) 。
然后考虑计数。因为只有 + 1 , − 1 +1,-1 + 1 , − 1 于是转化成折线图上每一层的问题。又因为是一层一层的,所以(好像真的)不难想到从上往下每一层进行连续段 dp。设 d p i , j , k dp_{i,j,k} d p i , j , k 表示已经填了 i i i 个位置,当前已经有 j j j 对 s x = s y s_x=s_y s x = s y ,当前层有 k k k 个间隔,则转移为 d p i , j , k → d p i + l , j + ( l 2 ) , l − k − 2 dp_{i,j,k}\to dp_{i+l,j+\binom l2,l-k-2} d p i , j , k → d p i + l , j + ( 2 l ) , l − k − 2 。最后只需要把 ≥ 0 \ge 0 ≥ 0 部分的和 < 0 <0 < 0 的合并即可。
这里暂时空着一下,明天再写。
[ARC118C] Coprime Set (*1151)
首先先确保 gcd i a i = 1 \gcd_ia_i=1 g cdi a i = 1 ,构造 6 , 10 , 15 6,10,15 6 , 1 0 , 1 5 三个数就行。然后把是其中至少一个的倍数的输出,发现是够的。
[ARC118D] Hamiltonian Cycle (*2448)
首先先搜出来只进行 × a \times a × a 或 × b \times b × b 能进行多少次。若 = p − 1 =p-1 = p − 1 就直接结束。否则设分别 x , y x,y x , y 次,则建所有 i → a i m o d p i\to ai\bmod p i → a i m o d p 的边,容易发现这样会形成 p − 1 x \frac{p-1}x x p − 1 个大小为 x x x 的环。于是现在问题就变成了,如何利用 i → b i m o d p i\to bi\bmod p i → b i m o d p 的边到达并遍历所有的环。
首先考虑无解的情况,容易发现,走 x gcd ( x , y ) \frac x{\gcd(x,y)} g cd( x , y ) x 次 a a a 的边会等价于走 y gcd ( x , y ) \frac y{\gcd(x,y)} g cd( x , y ) y 次 b b b 的,因为重复 gcd ( x , y ) \gcd(x,y) g cd( x , y ) 次这样的操作都会走会起点。而这 y gcd ( x , y ) \frac y{\gcd(x,y)} g cd( x , y ) y 次操作一定会到不同的环上,否则这个值会变小。于是,若 x y gcd ( x , y ) < p − 1 \frac{xy}{\gcd(x,y)}<p-1 g cd( x , y ) x y < p − 1 则一定无解。
否则就直接考虑构造。考虑先把每个环经过一遍,最后再在回溯时遍历每一个环。具体路径就是 1 → 1 b → 1 b 2 → ⋯ → 1 b n x − 1 → a b n x − 1 → a 2 b n x − 1 → ⋯ a x − 1 b n x − 1 → a x − 1 b n x − 2 → a x − 2 b n x − 2 → ⋯ 1\to \frac 1b\to\frac 1{b^2}\to\cdots\to \frac 1{b^{\frac nx-1}}\to \frac a{b^{\frac nx-1}}\to \frac {a^2}{b^{\frac nx-1}}\to\cdots\frac {a^{x-1}}{b^{\frac nx-1}}\to \frac {a^{x-1}}{b^{\frac nx-2}}\to \frac {a^{x-2}}{b^{\frac nx-2}}\to\cdots 1 → b 1 → b 2 1 → ⋯ → b x n − 1 1 → b x n − 1 a → b x n − 1 a 2 → ⋯ b x n − 1 a x − 1 → b x n − 2 a x − 1 → b x n − 2 a x − 2 → ⋯ 。这样一圈用 × a \times a × a 跑,一圈用 × 1 a \times\frac 1a × a 1 跑。最后再回去 1 1 1 即可。
[ARC118E] Avoid Permutations ∇ \color{blue}\nabla ∇ (*3092)
不经过 ( i , P i ) (i,P_i) ( i , P i ) 的限制直接做比较困难,容易想到套路容斥,钦定若干个 i i i ,一定经过 ( i , P i ) (i,P_i) ( i , P i ) ,再进行计数。则设 d p i , j , k , 0 / 1 , 0 / 1 dp_{i,j,k,0/1,0/1} d p i , j , k , 0 / 1 , 0 / 1 表示当前已经走到了 ( i , j ) (i,j) ( i , j ) ,钦定了 k k k 个点,这一行/列是否已经选了,则转移只用枚举这一步往右或网上走,以及如果这一列的 P i P_i P i 没有给定,是否选下一个点即可。
感觉真挺简单的
[ARC119C] ARC Wrecker 2 (*1354)
容易发现若一个序列奇数位的和等于偶数位的和就可以消,前缀和一下就行。
[ARC119D] Grid Repainting 3 (*2713)
首先,若最后选了 x x x 行 y y y 列,则白色格子数为 x m + y n − x y xm+yn-xy x m + y n − x y 。这个式子不太好求最值,所以考虑的方向就是枚举 x x x 算 y y y 最大值。
然后考虑如何判断一个方案是否合法,先套路化地在行和列之间连边,若 ( i , j ) (i,j) ( i , j ) 为红色,则连 ( i , j + n ) (i,j+n) ( i , j + n ) 的双向边,每条边都代表一个点,然后给每条边定向,若方向为 u → v u\to v u → v 则表示,这条边操作的是 u u u ,并且 u u u 要比 v v v 先进行操作,否则操作 v v v 时会把这条边所代表的点染成白色。
于是就有结论:合法的操作中一定不会出现环,更进一步,会形成一棵内向树。若这个连通块不是一棵树,则任意选一棵生成树。并且根所代表的行/列不会被操作。也就是说,一个联通块内一定会有一个点不会被操作。同时又发现,我们不关心操作的行/列具体是哪些,只关心个数。
所以设一个联通块 i i i 内代表行的点的个数为 x i x_i x i ,列为 y i y_i y i 。则对 ( x , y ) (x,y) ( x , y ) 的贡献只可能是 ( x i − 1 , y ) (x_i-1,y) ( x i − 1 , y ) 或 ( x i , y i − 1 ) (x_i,y_i-1) ( x i , y i − 1 ) ,而且必须 > 0 >0 > 0 。于是可以进行一个简单的背包 dp 解决。最后输出方案也是平凡的,只用对于每个连通块找到一个根,然后后序遍历生成树输出即可。
最近有在刷没在写,啥时候有空了多补一点。
[ARC119E] Pancakes (*2502)
其实这题怎么搞基本都能过,问题在于如何找到一个优美的实现方式。
首先显然翻转 [ l , r ] [l,r] [ l , r ] 只会改变 a l , a l − 1 a_l,a_{l-1} a l , a l − 1 和 a r , a r + 1 a_r,a_{r+1} a r , a r + 1 两对。考虑绝对值的几何意义,即在数轴上的线段,有 a < b , c < d a<b,c<d a < b , c < d 四个端点,显然不交的长度和小于相交,而回到原序列,相交当且仅当 a l − 1 < a l , a r < a r + 1 a_{l-1}<a_l,a_r<a_{r+1} a l − 1 < a l , a r < a r + 1 或反过来。
于是问题就变成求 max ( min ( a l , a r + 1 ) ) − max ( a l − 1 , a r ) ) , a l − 1 < a l , a r < a r + 1 \max(\min(a_l,a_{r+1}))-\max(a_{l-1},a_r)),a_{l-1}<a_l,a_r<a_{r+1} max ( min ( a l , a r + 1 ) ) − max ( a l − 1 , a r ) ) , a l − 1 < a l , a r < a r + 1 。考虑从大到小枚举 a i a_i a i 作为 a l a_l a l ,容易发现对换 a l − 1 , a l a_{l-1},a_l a l − 1 , a l 和 a r , a r + 1 a_r,a_{r+1} a r , a r + 1 后结果不变,所以不需要考虑 l < r l<r l < r 的限制。于是只需要最大化交集即可,即维护已经没枚举到的 min a i − 1 \min a_{i-1} min a i − 1 。求出最大交集即可。
[ARC119F] AtCoder Express 3 ∇ ◊ \color{blue}\nabla\Diamond ∇ ◊ (*3671)
其实没啥好写的 发现 ABBBBBBA 这样,中间连续的 B 数量大于四个时,一定会直接从 A 跳过去,所以可以近似地看成 ABBBBA 类似,于是合法状态不多,◊ \color{blue}\Diamond ◊ 考虑建出一个自动机,分 13 种状态进行转移,然后就没了(
[ARC120C] Swaps 2 (*1478)
容易发现,a a a 中的元素往前移动一位就会 + 1 +1 + 1 ,往后 − 1 -1 − 1 ,所以若最后 a i a_i a i 与 b j b_j b j 配对,则有 a i + i − j = b j a_i+i-j=b_j a i + i − j = b j 即 a i + i = b j + j a_i+i=b_j+j a i + i = b j + j ,于是就变成了求交换多少次能使 a ′ = b ′ a'=b' a ′ = b ′ ,BIT 解决。
[ARC120D] Bracket Score 2 (*1996)
不难发现一个理论上界是 a i a_i a i 中最大的 n n n 个减去最小的 n n n 个。考虑如何构造。若把最大的 n n n 个看作 + 1 +1 + 1 ,其他 − 1 -1 − 1 ,则若前缀和始终 ≥ 0 \ge 0 ≥ 0 就直接把 + 1 +1 + 1 变成 (,− 1 -1 − 1 )。但是不一定有这个性质,不过发现,如果前缀和出现负数,就把 + 1 , − 1 +1,-1 + 1 , − 1 反过来,这样也是不会改变对应关系的。于是构造完了。
[ARC120E] 1D Party (*2653)
考虑令两个人相遇之后,不回头,而是将两个人身份调换,继续往同个方向走。
此时什么时候合法,发现若某个 ≥ i \ge i ≥ i 的人和某个 < i <i < i 的人相遇,则在原问题中 i − 1 i-1 i − 1 和 i i i 就一定会相遇,于是令最后 i i i 和 j j j 相遇,则每个 [ i − 1 , i ] [i-1,i] [ i − 1 , i ] 的线段都至少被一对 [ i , j ] [i,j] [ i , j ] 包含。于是考虑将若干 [ i , j ] [i,j] [ i , j ] 之间配对,则答案为合法的配对方案中 max a j − a i \max a_j-a_i max a j − a i 最小的。
此时又有一个观察:如果 j − i j-i j − i 比较大,具体地如果 > 3 >3 > 3 时,容易发现此时拆分成两个区间也是合法的,答案也更小。于是考虑 d p i dp_i d p i 表示前 i i i 条边已经被覆盖的最小代价,枚举转移当前的配对的长度即可。
[ARC120F] Wine Thief (*3094)
考虑固定一个 i i i 算 a i a_i a i 的贡献。如果直接枚举一边的个数就得到了讨论区里的式子,比较难做。于是就需要把两边放在一起考虑 。
具体地,考虑当前既然钦定 i i i 选了,那 i + 1 i+1 i + 1 和 i − 1 i-1 i − 1 都不能选,于是把 [ 1 , i − 2 ] [1,i-2] [ 1 , i − 2 ] 和 [ i + 2 , n ] [i+2,n] [ i + 2 , n ] 拼起来算选 k − 1 k-1 k − 1 个的方案数。但是同时又发现,i − 2 i-2 i − 2 和 i + 2 i+2 i + 2 可以同时选。于是考虑在中间新插入一个元素,值为 0 0 0 ,再去算方案数。
此时又有一个问题:如果选了那个新插入的元素,那么实际上在原序列中就只选了 m − 2 m-2 m − 2 个元素。于是考虑再容斥掉,减去一定选了这个元素,其他位置一共选了 m − 2 m-2 m − 2 个的方案数。不难发现这是一个子问题。
于是考虑设 S o l v e ( x , y , k ) Solve(x,y,k) S o l v e ( x , y , k ) 表示当前钦定要选的点左边(也就是类似上文的 [ 1 , i − 2 ] [1,i-2] [ 1 , i − 2 ] )还有 x x x 个元素,右边有 y y y 个,还要从中选 k k k 个。则选中 i i i 的方案数为 S o l v e ( i − 2 , n − i − 1 , m − 1 ) Solve(i-2,n-i-1,m-1) S o l v e ( i − 2 , n − i − 1 , m − 1 ) 。S o l v e Solve S o l v e 大概长这样:
int solve(int x,int y,int k){
if(x>y){
return solve(y,x,k);
}
if(!x){
return binom(y-k+1,k);
}
return Mod(binom(x+y-k+2,k),mod-solve(x-1,y-1,k-1));
}
其中显然有无用信息,注意到每次组合数的值只和 x + y x+y x + y 和 k k k 有关,只有迭代次数和 min ( i − 2 , n − i − 1 ) \min(i-2,n-i-1) min ( i − 2 , n − i − 1 ) 有关。于是简化一下,变成循环的形式就是:
int j=m-1,k=n-3,p=1;
for(j=m-1,k=n-3,p=1;j>=m-x+1;j--,p^=1,k-=2){
if(p){
sum=Mod(sum,binom(k-j+2,j));
}else{
sum=Mod(sum,mod-binom(k-j+2,j));
}
}
if(p){
sum=Mod(sum,binom(k-j+1,j));
}else{
sum=Mod(sum,mod-binom(k-j+1,j));
}
其中 j j j 为还要选的个数,k k k 为当前序列长度,p p p 表示正负性。
再发现 i i i 只会限制代码中 j j j 的范围。于是预处理 f i = ∑ i ≤ j ≤ m − 1 ( − 1 ) m − j + 1 ( k − j + 1 j ) f_i=\sum_{i\le j\le m-1}(-1)^{m-j+1}\binom{k-j+1}{j} f i = ∑ i ≤ j ≤ m − 1 ( − 1 ) m − j + 1 ( j k − j + 1 ) 就可以把循环部分干掉了。
总复杂度 O ( n ) O(n) O ( n ) 。
[ARC121C] Odd Even Sort (*1856)
考虑依次把 1 1 1 到 n n n 归位。对于 i < n − 2 i<n-2 i < n − 2 的数,若当前操作能使 i i i 往前一位则一直操作直到归位,否则一定能找到一个不会影响到 i i i 的位置过掉一轮。 i ≥ n − 2 i\ge n-2 i ≥ n − 2 的直接手玩一组构造即可。
[ARC121D] 1 or 2 (*2784)
首先有一个结论,就是我们一定会选连续的若干个数为单个填的数。证明考虑,如果 a < b < c a<b<c a < b < c ,选了 a , c a,c a , c 不选 b b b ,考虑若和 b b b 配对的是 x x x ,则若 x > 0 x>0 x > 0 则换成 a , x a,x a , x 配对不劣,否则换成 c , x c,x c , x 不劣(这个证明应该没问题吧)。
然后就考虑选了 [ l , r ] [l,r] [ l , r ] ,其他的数怎么配对,不妨设 l − 1 > n − r l-1>n-r l − 1 > n − r ,考虑 a 1 a_1 a 1 ,如果它和 a n a_n a n 配对比 a n − 1 a_{n-1} a n − 1 劣的话,则 a n a_n a n 若不和 a 1 a_1 a 1 配对只会导致 max \max max 值变大。所以又有一个重要结论:我们会先尽可能的让最小的和最大的匹配。
于是发现可能的匹配只有两种:[ 1 , l − 1 ] [1,l-1] [ 1 , l − 1 ] 内的和 [ r + 1 , n ] [r+1,n] [ r + 1 , n ] 内的匹配,剩下还没匹配的每次从两端取一个数出来匹配。容易 O ( n 2 ) O(n^2) O ( n 2 ) 预处理。最后枚举 [ l , r ] [l,r] [ l , r ] 每次 O ( 1 ) O(1) O ( 1 ) 算即可。
[ARC121E] Directed Tree (*2645)
题目要求每个 a i a_i a i 都不能经过至少一条边到 i i i 。如果考虑对于一个 i i i ,怎么样的 a i a_i a i 合法,则会发现它可以是 i i i 子树内的点,i i i 的父亲的儿子的子树中,不包含 i i i 的子树内的点……这很难处理。
于是考虑正难则反,容易发现对于一个 i i i ,不合法的 a i a_i a i 是它的祖先。这个性质非常好,于是容斥。
考虑树形 dp,d p u , i dp_{u,i} d p u , i 表示 u u u 子树内有 i i i 个点的 a i a_i a i 还没有 被钦定为不合法,按照 O ( n 2 ) O(n^2) O ( n 2 ) 树形背包的方法转移。先不管 u u u 点,把儿子的背包合并。
然后加入 u u u 点,此时首先可能有一个 u u u 子树内的点 v v v ,a v → u a_v\to u a v → u 。乘上选点的方案数,于是 d p u , i = d p u , i + d p u , i + 1 × ( i + 1 ) dp_{u,i}=dp_{u,i}+dp_{u,i+1}\times (i+1) d p u , i = d p u , i + d p u , i + 1 × ( i + 1 ) 。然后 u u u 点一定还没有被钦定,d p u , i = d p u , i − 1 dp_{u,i}=dp_{u,i-1} d p u , i = d p u , i − 1 。
最后统计答案时,给每个没有钦定的 u u u 随便定一个 a i a_i a i ,方案数为阶乘,再乘上 dp 值和 ( − 1 ) n − i (-1)^{n-i} ( − 1 ) n − i 即可。
[ARC121F] Logical Operations on Tree (*2940)
首先考虑如何判断是否合法。容易发现,若把所有 OR 边断开,剩下的连通块中若有至少一个最后会变成 1 1 1 ,则显然合法。充分性显然,考虑证明必要性,如果先对 OR 边操作,则发现两个连通块会形成一个连通块,但是如果这个连通块最后会变成 1 1 1 ,则原来的两个连通块也至少有一个会变成 1 1 1 。
然后考虑计数。存在一个连通块为 1 1 1 的方案不好算,但是可以算不存在的方案。设 d p u , 0 / 1 dp_{u,0/1} d p u , 0 / 1 表示当前处理到 u u u 点,当前连通块内是否已经有了至少一个为 0 0 0 的点。转移枚举这条边是 OR 还是 AND 以及儿子所在连通块情况即可。
[ARC122C] Calculator (*1818)
本来想到了正解做法但是脑子抽了(
我们考虑一个神秘的数:5 + 1 2 \frac {\sqrt 5+1}2 2 5 + 1 。怎么得来的?我们倒着操作 x + y x+y x + y ,希望每次操作后 max ( x , y ) min ( x , y ) \frac{\max(x,y)}{\min(x,y)} min ( x , y ) max ( x , y ) 不变,则有 x − 1 = 1 x x-1=\frac 1x x − 1 = x 1 ,解得 x = 5 + 1 2 x=\frac{\sqrt 5+1}2 x = 2 5 + 1 。于是考虑最后 y = 5 + 1 2 y=\frac{\sqrt 5+1}2 y = 2 5 + 1 ,再操作回来。但是实际上这样有精度问题,于是枚举 [ y − 10 , y + 10 ] [y-10,y+10] [ y − 1 0 , y + 1 0 ] 内的数尝试操作即可。
[ARC122D] XOR Game (*2331)
考虑丢到 trie 树上做,从高到低位枚举。若有偶数个当前位为 1 1 1 的数,则答案这一位为 0 0 0 ,并且要把当前位为 0 0 0 的和 1 1 1 的分开做。否则答案这一位一定为 1 1 1 ,于是只用求在这一位为 1 1 1 和这一位为 0 0 0 的中各选一个,异或的最小值即可。
[ARC122E] Increasing LCMs ∇ ◊ \color{blue}\nabla\Diamond ∇ ◊ (*2535)
感觉挺厉害的。考虑如果正着做,当前选的数显然会影响后面某个数是否可行。◊ \color{blue}\Diamond ◊ 于是考虑倒退,每次删掉一个数,这样就只用考虑当前删掉的数是否合法。并且后删显然是不劣于先删的,所以只需要每次找出一个能删的删就一定是最优策略。
然后考虑如何判断是否能删,◊ \color{blue}\Diamond ◊ 这等价于 gcd ( lcm j = i a j , a i ) < a i \gcd(\operatorname{lcm}_{j\not=i} a_j,a_i)<a_i g cd( l c m j = i a j , a i ) < a i ,即 lcm ( gcd j = i ( a i , a j ) ) < a i \operatorname{lcm}(\gcd_{j\not=i}(a_i,a_j))<a_i l c m ( g cdj = i ( a i , a j ) ) < a i 。证明考虑对于一个质因数,前者相当于 min ( max a j , a i ) \min(\max a_j,a_i) min ( max a j , a i ) ,后者相当于 max ( min ( a i , a j ) ) \max(\min(a_i,a_j)) max ( min ( a i , a j ) ) ,显然等价。于是,每次 O ( n 2 log V ) O(n^2\log V) O ( n 2 log V ) 判断即可。
[ARC123D] Inc, Dec - Decomposition (*2143)
感觉 slope trick 运用的不太熟练啊。不过还是创过去了。
首先考虑题目中给出的限制即 b i ≤ b i + 1 , c i ≥ c i + 1 b_i\le b_{i+1},c_i\ge c_{i+1} b i ≤ b i + 1 , c i ≥ c i + 1 ,因为 b i + c i = a i b_i+c_i=a_i b i + c i = a i ,转化成 b i + 1 ≥ max ( a i + 1 − a i , 0 ) + b i b_{i+1}\ge\max(a_{i+1}-a_i,0)+b_i b i + 1 ≥ max ( a i + 1 − a i , 0 ) + b i 。
然后观察到 ∣ b i ∣ + ∣ c i ∣ ≤ ∣ b i + c i ∣ = ∣ a i ∣ |b_i|+|c_i|\le|b_i+c_i|=|a_i| ∣ b i ∣ + ∣ c i ∣ ≤ ∣ b i + c i ∣ = ∣ a i ∣ ,当且仅当 b i , c i b_i,c_i b i , c i 同正负的时候取得等号,否则若 b i > max ( a i , 0 ) b_i>\max(a_i,0) b i > max ( a i , 0 ) 会多出 b i − max ( a i , 0 ) b_i-\max(a_i,0) b i − max ( a i , 0 ) ,若 b i < min ( a i , 0 ) b_i<\min(a_i,0) b i < min ( a i , 0 ) 会多出 min ( a i , 0 ) − b i \min(a_i,0)-b_i min ( a i , 0 ) − b i 。
然后就可以考虑暴力 dp 算最少多出多少。d p i , j dp_{i,j} d p i , j 表示当前枚举到第 i i i 个数,b i = j b_i=j b i = j 的最小代价。则 d p i , j = min k < j − max ( a i − a i − 1 , 0 ) d p i − 1 , k + c ( i , j ) dp_{i,j}=\min_{k<j-\max(a_i-a_{i-1},0)} dp_{i-1,k}+c(i,j) d p i , j = min k < j − max ( a i − a i − 1 , 0 ) d p i − 1 , k + c ( i , j ) 。c ( i , j ) c(i,j) c ( i , j ) 是上面提到的多出的贡献。
考虑优化。容易发现对于一个 i i i ,c ( i , j ) c(i,j) c ( i , j ) 形如一条斜率为 − 1 -1 − 1 的射线拼上一段 y = 0 y=0 y = 0 的线段再拼上一条斜率为 1 1 1 的射线。容易联想到 slope trick。
考虑设 f i , j = min k < j − max ( a i − a i − 1 , 0 ) d p i , k f_{i,j}=\min_{k<j-\max(a_i-a_{i-1},0)}dp_{i,k} f i , j = min k < j − max ( a i − a i − 1 , 0 ) d p i , k ,维护 f i f_i f i 。不难发现 f i f_i f i 单调不增。考虑斜率为 − 1 -1 − 1 的射线对 f i f_i f i 的影响,显然就是在 min ( a i , 0 ) − 1 \min(a_i,0)-1 min ( a i , 0 ) − 1 的位置插入了一个折点。对于斜率为 1 1 1 的,若会影响到当前最小值的那一段,则会删掉最后一个折点,再在 max ( 0 , a i ) − 1 \max(0,a_i)-1 max ( 0 , a i ) − 1 位置插入一个折点,同时令最左侧最小值的位置为 p p p ,则使答案增加 ( p − max ( a i , 0 ) + 1 ) × 2 (p-\max(a_i,0)+1)\times 2 ( p − max ( a i , 0 ) + 1 ) × 2 。
此外每次 k < j − max ( a i − a i − 1 , 0 ) k<j-\max(a_i-a_{i-1},0) k < j − max ( a i − a i − 1 , 0 ) 也就是整体向右平移一段距离,打个标记维护即可。
[ARC124C] LCM of GCDs (*1495)
考虑先确定第一对怎么分配,可能的 gcd \gcd g cd 值就一定是分配的数的因数,然后 O ( n ) O(n) O ( n ) 检查能不能取到这个值即可。
[ARC124D] Yet Another Sorting Problem (*2008)
首先如果没有只能 01 之间交换的限制,之间连边找环就行。考虑加上这个限制,容易发现若一个环里面既有 0 0 0 又有 1 1 1 ,则显然是可以直接搞定的。否则手玩发现可以将一个全 0 0 0 环和全 1 1 1 环放在一起做,一共额外用 2 2 2 步,剩下的每个环也是额外 2 2 2 步。
[ARC124E] Pass to Next ◊ \color{blue}\Diamond ◊ (*3031)
考虑令 f i f_i f i 为 i i i 给 i m o d n + 1 i\bmod n+1 i m o d n + 1 的球数,则每个 min f i = 0 \min f_i=0 min f i = 0 的 f f f 和 b b b 之间构成双射,于是转化成求 ∑ ∏ a i − f i + f i − 1 \sum\prod a_i-f_i+f_{i-1} ∑ ∏ a i − f i + f i − 1 。
怎么算这个呢?如果是形如 a i − f i a_i-f_i a i − f i 这样,每一位是独立的,就可以分别算然后乘起来。但是还和 f i − 1 f_{i-1} f i − 1 有关。把乘积用分配律展开,硬上 dp:设 d p i , 0 / 1 , 0 / 1 dp_{i,0/1,0/1} d p i , 0 / 1 , 0 / 1 表示当前枚举到第 i i i 位,这一位的 f i f_i f i 是否确定,当前是否已经 ∃ j , f j = 0 \exists j,f_j=0 ∃ j , f j = 0 。
先算乘积的第一项为 a 1 a_1 a 1 或 − f 1 -f_1 − f 1 的时候的贡献。每一位有四种转移:
这一位选 a i a_i a i 。
这一位选 − f i -f_i − f i 且下一位不选 f i f_i f i 。
这一位选 f i − 1 f_{i-1} f i − 1 且上一位不选 f i − 1 f_{i-1} f i − 1 。
这一位和上一位都选 f i − 1 f_{i-1} f i − 1 。
转移很冗长不展开讲,大概就是对于选了的 f i f_i f i ,如果在 1 1 1 个位置选了,就乘上 ∑ j ≤ a i j = a i ( a i + 1 ) 2 \sum_{j\le a_i} j=\frac{a_i(a_i+1)}2 ∑ j ≤ a i j = 2 a i ( a i + 1 ) ,在 2 2 2 个位置选了就乘上 ∑ j ≤ a i j 2 = a i ( a i + 1 ) ( 2 a i + 1 ) 6 \sum_{j\le a_i}j^2=\frac{a_i(a_i+1)(2a_i+1)}6 ∑ j ≤ a i j 2 = 6 a i ( a i + 1 ) ( 2 a i + 1 ) ,如果没选,这个位置对乘积没有影响,但是对方案数有影响,所以也乘上 a i a_i a i 或 a i + 1 a_i+1 a i + 1 。
同时转移的时候要判断这一位是否有 f i = 0 f_i=0 f i = 0 ,这样的 i i i 只有在它没有被选到的时候对乘积有影响,在转移的时候加上这个转移即可。
最后统计答案的时候用类似的方法,判断 f n f_n f n 的情况即可。
然后算第一位选 f i − 1 f_{i-1} f i − 1 的贡献,容易发现 dp 转移时类似的,只用改变初始值即可。注意此时 i = 2 i=2 i = 2 时的转移 4 4 4 不能用。这样把所有贡献累加得到答案即可。
[ARC124F] Chance Meeting (*3246)
基本上是自己想出来了,但是亿眼丁真了最后一步加法卷积。
把 n , m n,m n , m 都先 − 1 -1 − 1 方便处理。首先不难证明两条路径的交一定是一行内连续的一段。于是考虑设 f i , j f_{i,j} f i , j 表示钦定 ( i , j ) (i,j) ( i , j ) 为两人第一次相遇的位置,走到 ( i , j ) (i,j) ( i , j ) 的方案数。容易发现走到 ( i , j ) (i,j) ( i , j ) 和从 ( i , j ) (i,j) ( i , j ) 到终点本质上是相同的,所以答案即为 ∑ f i , j × f i , n − j \sum f_{i,j}\times f_{i,n-j} ∑ f i , j × f i , n − j 。
第一次相遇的条件显然是不好直接做的,于是考虑进行一个容斥,先算 g i , j g_{i,j} g i , j 表示两人在 ( i , j ) (i,j) ( i , j ) 相遇的方案数,则 g i , j = ( n + 2 j n − i , i , j , j ) g_{i,j}=\binom{n+2j}{n-i,i,j,j} g i , j = ( n − i , i , j , j n + 2 j ) ,则 f i , j f_{i,j} f i , j 即为在 ( i , j ) (i,j) ( i , j ) 相遇的 g i , j g_{i,j} g i , j 减去在前面相遇再过来的方案,并且一定是在同一行相遇。考虑从 ( i , k ) (i,k) ( i , k ) 到 ( i , j ) (i,j) ( i , j ) 且中途不相遇的方案,钦定从 ( i , k ) (i,k) ( i , k ) 开始的第一步是 A 走的,那么最后就是 B 走,中途 AB 不相遇,不难发现方案数为卡特兰数。
于是令 h i h_i h i 表示卡特兰数第 i i i 位,可以得到 f i , j = g i , j − ∑ k < j g i , k h j − k − 1 f_{i,j}=g_{i,j}-\sum_{k<j}g_{i,k}h_{j-k-1} f i , j = g i , j − ∑ k < j g i , k h j − k − 1 。状态太大了先优化状态,发现 g i , j g_{i,j} g i , j 展开是 ( n + 2 j ) ! i ! ( n − i ) ! j ! j ! \frac{(n+2j)!}{i!(n-i)!j!j!} i ! ( n − i ) ! j ! j ! ( n + 2 j ) ! ,不难发现对于不同的 i i i ,式子是相同的,只需要乘上一个和 i i i 有关的系数。从另一个角度来说,可以先考虑向右的移动,对于上下的移动,只要固定了移动的序列,同时也就确定了相遇所在的行,于是不妨只对 i = n i=n i = n 求解,最后只需要乘上一个 ( 2 n n ) \binom{2n}n ( n 2 n ) 即可。
于是式子变成了 f i = g i − ∑ j < i g j h i − j − 1 f_{i}=g_{i}-\sum_{j<i}g_{j}h_{i-j-1} f i = g i − ∑ j < i g j h i − j − 1 ,这是个明显(但是我怎么没看出来???)的加法卷积形式,NTT 解决即可。
[ARC125C] LIS to Original Sequence (*1896)
首先 p 1 = a 1 p_1=a_1 p 1 = a 1 ,然后考虑第二位,这里可以插入一个尽可能小的数,但是后面只能接上 a 2 a_2 a 2 ,这样一直到 a m a_m a m ,在它前后放所有剩下的即可。
[ARC125D] Unique Subsequence ∇ \color{blue}\nabla ∇ (*2187)
好久之前做的典题。考虑 dp,如果 a j = a i , j < i a_j=a_i,j<i a j = a i , j < i ,则以 i i i 为结尾的子序列完全包含以 j j j 结尾的,于是后面不再从 j j j 转移。对于每个位置从所有可以转移的位置转移过来即可。
[ARC125E] Snack ◊ \color{blue}\Diamond ◊ (*2874)
非常 educational 的题啊。考虑从网络流的方向解决,容易建立一个最大流模型:源点向每个零食 i i i 连一条流量为 a i a_i a i 的边,每个零食 i i i 到小孩 j j j 连一条流量 b j b_j b j 的边,每个小孩 j j j 向汇点连一条流量为 c j c_j c j 的边。最大流显然就是答案。
但是这样 O ( n m ) O(nm) O ( n m ) 条边显然无法直接跑最大流。◊ \color{blue}\Diamond ◊ 考虑最大流转最小割,类似模拟网络流,算这个最小割。先考虑 a i a_i a i ,容易发现剩下的边的流量和割掉哪个 a i a_i a i 无关,只和没割掉的 a i a_i a i 的个数和 b j b_j b j 有关。于是贪心地,一定会从小到大割 a i a_i a i 。而对于每个小孩 j j j ,设没有割掉的数量为 c n t cnt c n t ,则还需要割掉 min ( c j , c n t × b j ) \min(c_j,cnt\times b_j) min ( c j , c n t × b j ) 的边。从小到大枚举 c n t cnt c n t 然后动态维护这个 min \min min 的式子即可。
[ARC125F] Tree Degree Subset Sum ∇ \color{blue}\nabla ∇ (*3541)
好牛逼的题,完全没有印象做过。
首先树的限制相当于 ∑ d i = 2 n − 2 , d i ≥ 1 \sum d_i=2n-2,d_i\ge 1 ∑ d i = 2 n − 2 , d i ≥ 1 ,全部 − 1 -1 − 1 变成 ∑ d i = n − 2 , d i ≥ 0 \sum d_i=n-2,d_i\ge 0 ∑ d i = n − 2 , d i ≥ 0 。
然后是结论:若 i i i 个物品能凑出 j j j 的价值,则对于一个固定的 j j j ,可行的 i i i 是一段区间。
证明考虑设有 c n t cnt c n t 个 0 0 0 ,l ( j ) ≤ i ≤ r ( j ) l(j)\le i\le r(j) l ( j ) ≤ i ≤ r ( j ) ,则若 r ( j ) − l ( j ) ≤ 2 c n t r(j)-l(j)\le 2cnt r ( j ) − l ( j ) ≤ 2 c n t 即得证,因为 l ( j ) l(j) l ( j ) 一定对应不选 0 0 0 ,r ( j ) r(j) r ( j ) 全选。考虑上面的 ( i , j ) (i,j) ( i , j ) 对,一定有 j − i ≥ − c n t j-i\ge -cnt j − i ≥ − c n t ,因为只有 c n t cnt c n t 个 0 0 0 。同时,若有 ( i , j ) (i,j) ( i , j ) ,则一定有 ( n − i , n − 2 − j ) (n-i,n-2-j) ( n − i , n − 2 − j ) ,其同样满足 n − 2 − j − n + i ≥ − c n t n-2-j-n+i\ge -cnt n − 2 − j − n + i ≥ − c n t 即 j − i ≤ c n t − 2 j-i\le cnt-2 j − i ≤ c n t − 2 。于是就有 j − c n t + 2 ≤ i ≤ c n t + j j-cnt+2\le i\le cnt+j j − c n t + 2 ≤ i ≤ c n t + j ,得证。
最后只用套路地进行一个背包求出 l ( j ) , r ( j ) l(j),r(j) l ( j ) , r ( j ) 即可。由于 ∑ d i = n − 2 \sum d_i=n-2 ∑ d i = n − 2 ,所以不同的 d i d_i d i 个数是 n \sqrt n n 级别的,二进制优化多重背包即可。
随机分析一下复杂度:∑ i < n d i = n − 2 \sum_{i<\sqrt n} d_i=n-2 ∑ i < n d i = n − 2 ,则 ∑ i < n log d i ≥ n log n = 1 2 n log n \sum_{i<\sqrt n} \log d_i\ge\sqrt n\log \sqrt n=\frac 12\sqrt n\log n ∑ i < n log d i ≥ n log n = 2 1 n log n 。不过常数小。
[ARC126C] Maximize GCD (*1824)
首先考虑 gcd x ∈ S x ≤ min x ∈ S x \gcd_{x\in S} x\le \min_{x\in S}x g cdx ∈ S x ≤ min x ∈ S x ,当且仅当 S S S 内元素全部相等时成立。于是如果可以使 S S S 内元素全部相等答案即为最大可能的 min \min min 。
否则最终 gcd a i < max a i \gcd a_i<\max a_i g cda i < max a i 。枚举这个 gcd \gcd g cd 是什么,然后随便算一算即可。由于我没有脑子所以写了 O ( n V ) O(n\sqrt V) O ( n V ) 。
[ARC126D] Pure Straight (*2332)
设 d p i , S dp_{i,S} d p i , S 表示当前枚举到第 i i i 位,已经选定的 [ 1 , m ] [1,m] [ 1 , m ] 内的数的集合为 S S S ,最小代价。转移考虑,如果不选这个数,则会移到所有选的数的前面或后面,贪心看哪个小选哪个。否则只用考虑 S S S 内元素和它组成的逆序对即可。
[ARC126E] Infinite Operations ◊ \color{blue}\Diamond ◊ (*2766)
非常有趣的脑电波题。
首先显然我们要会算一个序列的答案。这个操作很难直接模拟,◊ \color{blue}\Diamond ◊ 所以可以考虑设计一个势能函数 f ( a ) f(a) f ( a ) ,把序列的变化转化成 f ( a ) f(a) f ( a ) 的变化,从而求出操作次数。
而想要找到一个合适的势能,则可以考虑从结束状态入手。结束状态 f ( a ) = 0 f(a)=0 f ( a ) = 0 ,所有 a i a_i a i 相同,也就是两两之间距离为 0 0 0 。考虑令 f ( a ) = ∑ 1 ≤ i ≤ j ≤ n ∣ a i − a j ∣ f(a)=\sum_{1\le i\le j\le n}|a_i-a_j| f ( a ) = ∑ 1 ≤ i ≤ j ≤ n ∣ a i − a j ∣ 。
先把 a i a_i a i 排序。考虑对 i , j ( i < j ) i,j(i<j) i , j ( i < j ) 操作一个 Δ \Delta Δ 之后变成 a ′ a' a ′ ,f ( a ) f(a) f ( a ) 的变化。容易发现,∀ k > j , a k ′ − a j ′ = a k − a j + Δ , a k ′ − a i ′ = a k − a i − Δ \forall k>j,a_k'-a_j'=a_k-a_j+\Delta,a_k'-a_i'=a_k-a_i-\Delta ∀ k > j , a k ′ − a j ′ = a k − a j + Δ , a k ′ − a i ′ = a k − a i − Δ ,相抵消之后不变。而 ∀ k , i < k < j \forall k,i<k<j ∀ k , i < k < j ,可以发现 a k − a i + a j − a k = a j − a i = a j ′ − a i ′ − 2 Δ a_k-a_i+a_j-a_k=a_j-a_i=a_j'-a_i'-2\Delta a k − a i + a j − a k = a j − a i = a j ′ − a i ′ − 2 Δ ,对于 a j − a i a_j-a_i a j − a i 则也是减少了 2 Δ 2\Delta 2 Δ 。不难发现当且仅当 j = i + 1 j=i+1 j = i + 1 时,势能减少的最少,为 2 Δ 2\Delta 2 Δ ,也就是每次消耗 2 Δ 2\Delta 2 Δ 的势能获得 Δ \Delta Δ 的价值。
于是得到结论:答案为 1 2 ∑ 1 ≤ i ≤ j ≤ n a j − a i \frac 12\sum_{1\le i\le j\le n}a_j-a_i 2 1 ∑ 1 ≤ i ≤ j ≤ n a j − a i 。剩下的部分是 trivial 的,随便用一个线段树维护一下即可。重要的还是如何转化这个问题。
闲话:你这场 F 这么几把难是怎么评的 *3488 的啊?
哦,原来是某 2 Dan(指 rainboy)场了啊。
rainboy 害人不浅。
[ARC127C] Binary Strings (*2092)
考虑每一个位置选 1 / 0 1/0 1 / 0 对排名的贡献。设当前数为 x x x ,如果选 0 0 0 ,此数的排名为 x x x 的排名 + 1 +1 + 1 ,否则,发现全部改为选 0 0 0 的情况,排名都会在此数前面,则会将排名 + 2 k + 1 +2^{k+1} + 2 k + 1 ,k k k 为该位置为从低到高第几位。
所以,我们可以从高位开始枚举,每次能取 1 1 1 就取,相当于每次将要求排名减去一个数。容易发现,如果取 1 1 1 ,要求排名对应位置一定也是 1 1 1 ,于是将那一位变为 0 0 0 即可。否则,将排名 − 1 -1 − 1 的操作相当于将一段为 0 0 0 的后缀全部变成 1 1 1 并将前一位变为 0 0 0 。
这个操作很容易用线段树维护。直到排名的 01 01 0 1 序列全为 0 0 0 时停止。
[ARC127D] Sum of Min of Xor ◊ \color{blue}\Diamond ◊ (*2593)
首先考虑计算 ( i , j ) (i,j) ( i , j ) 为有序对时的答案,原问题答案只需要 × 1 2 \times \frac 12 × 2 1 。先钦定 min ( a i ⊕ a j , b i ⊕ b j ) = a i ⊕ a j \min(a_i\oplus a_j,b_i\oplus b_j)=a_i\oplus a_j min ( a i ⊕ a j , b i ⊕ b j ) = a i ⊕ a j ,∑ a i ⊕ a j \sum a_i\oplus a_j ∑ a i ⊕ a j 是容易拆位算的,于是考虑如何求 ∑ [ a i ⊕ a j > b i ⊕ b j ] ( b i ⊕ b j − a i ⊕ a j ) \sum[a_i\oplus a_j>b_i\oplus b_j](b_i\oplus b_j-a_i\oplus a_j) ∑ [ a i ⊕ a j > b i ⊕ b j ] ( b i ⊕ b j − a i ⊕ a j ) 。
> > > 并不好做,对于 ⊕ \oplus ⊕ 常见的套路是枚举最高的不一样的位 p p p ,设 a i , j a_{i,j} a i , j 为 a i a_i a i 的前 j j j 位组成的数。则有 a i , p − 1 ⊕ a j , p − 1 = b i , p − 1 ⊕ b j , p − 1 a_{i,p-1}\oplus a_{j,p-1}=b_{i,p-1}\oplus b_{j,p-1} a i , p − 1 ⊕ a j , p − 1 = b i , p − 1 ⊕ b j , p − 1 。
◊ \color{blue}\Diamond ◊ 因为 = = = 在 ⊕ \oplus ⊕ 中有很好的性质,所以直接转化成 a i , p − 1 ⊕ b i , p − 1 = a j , p − 1 ⊕ b j , p − 1 a_{i,p-1}\oplus b_{i,p-1}=a_{j,p-1}\oplus b_{j,p-1} a i , p − 1 ⊕ b i , p − 1 = a j , p − 1 ⊕ b j , p − 1 ,也就是 a i ⊕ b i a_i\oplus b_i a i ⊕ b i 的一段前缀相等。把 a i ⊕ b i a_i\oplus b_i a i ⊕ b i 全部丢到 trie 树上,则就是找到这段前缀对应的点,对于经过这个点后和 a i ⊕ b i a_i\oplus b_i a i ⊕ b i 分开的 a j ⊕ b j a_j\oplus b_j a j ⊕ b j 然后算贡献。这一部分是简单的,只用钦定 a i ⊕ a j = 1 a_i\oplus a_j=1 a i ⊕ a j = 1 ,预处理一些东西然后拆位算贡献即可。
时间复杂度 O ( n log 2 n ) O(n\log^2 n) O ( n log 2 n ) 。
[ARC127E] Priority Queue ∇ \color{blue}\nabla ∇ (*2678)
怎么本质相同,思路完全不同的做法这么多。
考虑一个位置被删掉的数是 x x x ,则显然 ∀ y > x \forall y>x ∀ y > x 也是可行的。同时发现越往后的二操作能删的数的范围会越小,于是令删掉的数单调上升显然不劣。于是考虑删除集合,设 d p i , j dp_{i,j} d p i , j 表示第 i i i 个删除删除了 j j j 的方案数。
每个 i i i 都会有一个限制,具体地,考虑它要比前面所有删除操作和没有被删掉的数大,可以对于每个二操作删掉前面第一个一操作,剩下的就是上述的数,算出每个位置的限制即可。
[ARC128C] Max Dot (*1810)
首先,如果不考虑 m m m 的限制,则有结论:p 1 p_1 p 1 的极长相同连续段数量为 2 2 2 ,其中一段为 0 0 0 。证明考虑不断拿出两个非 0 0 0 段,设其平均值分别为 x , y x,y x , y ,那么若 x < y x<y x < y 则把前者的值全部给后者,否则把后者的部分给前者,使两段合并成一段最优。
有 m m m 的限制则发现最多变成三段,具体是最后一段为 m m m ,第一段 0 0 0 。O ( n 2 ) O(n^2) O ( n 2 ) 枚举即可。
[ARC128D] Neq Neq (*2554)
感觉还是套路题,不过后面想条件把自己绕晕了……
要求是选 a i − 1 = a i , a i + 1 = a i a_{i-1}\not=a_i,a_{i+1}\not=a_i a i − 1 = a i , a i + 1 = a i 然后删 a i a_i a i ,这很不好,套路地把删变成加,于是问题就变成,有多少个原序列的子序列,使得可以在其中进行若干次加数操作变成原序列。
容易发现这个子序列把原序列分成了若干个段,每个段之间独立,显然可以 dp。设 d p i dp_i d p i 为子序列最后一位为 i i i 时的方案数,现在只用快速找到能转移的范围即可。
先考虑如何判定一段 [ i , j ] [i,j] [ i , j ] 能否合法。首先,如果中间有 a k = a k + 1 a_k=a_{k+1} a k = a k + 1 则显然不合法,并且若其中只有两种数,则什么操作都做不了,显然不合法。
最后结论是除了上面两种情况都合法。证明考虑类似归纳。随便选 [ i , j ] [i,j] [ i , j ] 中值和 a i , a j a_i,a_j a i , a j 中不同的一个位置 k k k ,则若 [ i , k ] [i,k] [ i , k ] 中只有两种不同,则可以在原来的 [ i , j ] [i,j] [ i , j ] 中不断增加 i i i ,否则归纳下去。
最后通过这些限制得到可以转移的范围,前缀和优化即可,有一些 j − i ≤ 2 j-i\le2 j − i ≤ 2 的特判。
[ARC128E] K Different Values (*3049)
感觉好 sb 啊。怎么评到 *3000+ 的。
首先考虑如何判断一个局面是否有解。直觉上就是 max A i ≤ ∑ A i m + 1 \max A_i\le \frac{\sum A_i}{m}+1 max A i ≤ m ∑ A i + 1 ,且取等的不超过 ∑ A i m o d m \sum A_i\bmod m ∑ A i m o d m 个。看了题解区知道可以归纳证明。
然后考虑最小化字典序,不难想到直接每一位判断当前是否需要放一个 A i = ∑ A i m + 1 A_i=\frac{\sum A_i}{m}+1 A i = m ∑ A i + 1 的,然后找到最小的符合条件的 i i i 即可。
[ARC129C] Multiple of 7 (*1687)
首先考虑 777 ⋯ 7 777\cdots 7 7 7 7 ⋯ 7 这样长为 x x x 的段,对答案有 x × ( x + 1 ) 2 \frac{x\times(x+1)}2 2 x × ( x + 1 ) 的贡献,于是尝试用这种方法构造出来。考虑用若干个 x i × ( x i + 1 ) 2 \frac{x_i\times(x_i+1)}2 2 x i × ( x i + 1 ) 得到出 n n n ,每两段中间加入一个数隔开。
现在问题就变成了如何使得隔开的这几个数组成的数不能被 7 7 7 整除。zlt 说随机,但是其实没有什么必要,因为打表发现最大的段数为 m = 6 m=6 m = 6 ,也就是可以直接爆搜。
但是这个方法太不漂亮了。考虑每次加入一段,决定中间的隔开的数。称这些数为 b 1 , ⋯ , b k b_1,\cdots,b_k b 1 , ⋯ , b k 。考虑 b 1 , ⋯ , b k b_1,\cdots,b_k b 1 , ⋯ , b k 分别到 b k + 1 b_{k+1} b k + 1 的子段组成的数,它们一定两两不同,否则前面一定有一段可以整除 7 7 7 ,并且没有 0 0 0 。于是不妨先假设 b k + 1 = 0 b_{k+1}=0 b k + 1 = 0 ,和 b 1 , ⋯ , b k b_1,\cdots,b_k b 1 , ⋯ , b k 组成的数分别为 c 1 , ⋯ , c k c_1,\cdots,c_k c 1 , ⋯ , c k ,则 c c c 中数互不相同。其中一定会有 0 0 0 ,此时再使 b k + 1 b_{k+1} b k + 1 变化,也就是使 ∀ i ≤ k , c k → ( c k + Δ ) m o d 7 \forall i\le k,c_k\to (c_k+\Delta)\bmod 7 ∀ i ≤ k , c k → ( c k + Δ ) m o d 7 ,使其中没有 7 7 7 即可。
时间复杂度 O ( n + m 2 ) O(n+m^2) O ( n + m 2 ) 。
[ARC129D] -1+2-1 ◊ \color{blue}\Diamond ◊ (*2300)
原有的操作还是太难看了,考虑变化为前缀和。然后就会发现,操作变成了在前缀和数组 s s s 上选一个位置 i i i ,s i → s i − 1 , s i + 1 → s i + 1 s_i\to s_i-1,s_{i+1}\to s_i+1 s i → s i − 1 , s i + 1 → s i + 1 。
但是发现一个问题:一个环的前缀和怎么定义?这是困难的,但是不妨换一个角度,◊ \color{blue}\Diamond ◊ 考虑 a i a_i a i 是 s i s_i s i 的差分数组,于是可以令 s i + a i = s i m o d n + 1 s_i+a_i=s_{i\bmod n+1} s i + a i = s i m o d n + 1 。这样当 ∑ a i = 0 \sum a_i\not=0 ∑ a i = 0 时会出现矛盾,但是这个情况显然无解。
完成了 s s s 的定义后就简单了。最后要还原成 a i = 0 a_i=0 a i = 0 ,变成 s s s 则是 s i s_i s i 全部相等。首先 ∑ s i m o d n > 0 \sum s_i\bmod n>0 ∑ s i m o d n > 0 则无解,否则直接能操作就操作,直接模拟即可。具体地,只需要将整个环枚举两次即可。
[ARC129E] Yet Another Minimization ◊ \color{blue}\Diamond ◊ (*3337)
非常有趣的网络流题!由于想到切糕那个 trick 所以成功自己独立做出来了。
首先看到题,发现题意是某些变量达成某种条件获得一定权值。结合非常小的数据范围,不难想到网络流。
然后想怎么建模。对于这种每个变量有若干取值的,想到切糕那题的方法。◊ \color{blue}\Diamond ◊ 具体就是,考虑对于每一个变量 x i x_i x i 建出一条链,那么考虑最小割,链上一定要断掉一条边,断掉不同的边代表选不同的 x i = a i , j x_i=a_{i,j} x i = a i , j ,代价为 c i , j c_{i,j} c i , j 。
回到这道题,发现 ∣ x i − x j ∣ |x_i-x_j| ∣ x i − x j ∣ 这一部分难以处理。考虑进行一些转化。容易发现 ∣ x i − x j ∣ = ∑ x i ≤ k ≤ x j 1 + ∑ x j ≤ k ≤ x i 1 |x_i-x_j|=\sum_{x_i\le k\le x_j}1+\sum_{x_j\le k\le x_i}1 ∣ x i − x j ∣ = ∑ x i ≤ k ≤ x j 1 + ∑ x j ≤ k ≤ x i 1 。
考虑每条链上都建值域个点,然后 ∀ i = j , ∀ k \forall i\not=j,\forall k ∀ i = j , ∀ k ,链 i i i 的第 k k k 个点向链 j j j 的第 k k k 个点连一条流量为 W i , j W_{i,j} W i , j 的边。不难发现,此时如果取 x i = x , x j = y x_i=x,x_j=y x i = x , x j = y ,则还需要割的边有 ∣ x − y ∣ |x-y| ∣ x − y ∣ 条,满足要求。
但是这样建图离散化之后也有 O ( n 2 m ) O(n^2m) O ( n 2 m ) 个点,O ( n 3 m ) O(n^3m) O ( n 3 m ) 条边,会被精心构造数据卡掉。
但是可以发现,上面链 i , j i,j i , j 之间的连边,有很多都是多余的。于是考虑不建多余的点,考虑对于链 i , j i,j i , j ,i i i 向 j j j 怎么连边。
从小往大扫 a i , k a_{i,k} a i , k 和 a j , k a_{j,k} a j , k ,记录一个量 l s t = a j , 1 lst=a_{j,1} l s t = a j , 1 。对于一个 a i , k a_{i,k} a i , k ,依次枚举所有还没枚举过的,满足 a j , l < a i , k a_{j,l}<a_{i,k} a j , l < a i , k 的 l l l ,则 ( i , k ) (i,k) ( i , k ) 向 ( j , l ) (j,l) ( j , l ) 连流量为 W i , j × ( a j , l − l s t ) W_{i,j}\times(a_{j,l}-lst) W i , j × ( a j , l − l s t ) 的边,然后 l s t → a j , l lst\to a_{j,l} l s t → a j , l 。
枚举完后,再让 ( i , k ) (i,k) ( i , k ) 向 ( j , p + 1 ) (j,p+1) ( j , p + 1 ) 连流量为 W i , j × ( a i , k − l s t ) W_{i,j}\times(a_{i,k}-lst) W i , j × ( a i , k − l s t ) 的边,其中 p p p 为这次枚举到的 max l \max l max l ,然后 l s t → a i , k lst\to a_{i,k} l s t → a i , k 。
如果我给你解释为什么这样连是对的可能要解释很久,所以不如自己手玩一下理解吧。
这样点数 O ( n m ) O(nm) O ( n m ) ,边数 O ( n 2 m ) O(n^2m) O ( n 2 m ) ,复杂度用 dinic 是 O ( n 4 m 3 ) O(n^4m^3) O ( n 4 m 3 ) ,足以通过。
[ARC130D] Zigzag Tree ∇ \color{blue}\nabla ∇ (*2437)
考虑令黑点为相邻点全部大于它的,白色反之。则这棵树一定是黑白相邻的。
然后考虑 dp。设 d p u , i , 0 / 1 dp_{u,i,0/1} d p u , i , 0 / 1 表示在 u u u 子树内,点 u u u 的排名为 i i i 的方案数。转移时考虑 v v v 中有多少排名在 u u u 前面,乘上几个组合数,并前缀和优化即可。
[ARC130E] Increasing Minimum ◊ □ \color{blue}\Diamond\Box ◊ □ (*3188)
非常厉害的题!一直想到差分约束状物去了,◊ □ \color{blue}\Diamond\Box ◊ □ 但是事实上差分约束并不适合做这种要求最小化字典序的题,还是要从整体上去分析整个序列的性质。
考虑对操作序列分段,每一段操作完后 min \min min 不变。考虑如何分段是合法的。首先每一段内不能有重复的数。其次后面的段中的数的集合是完全包含前面的。这是因为第 i − 1 i-1 i − 1 段操作完后,段内所有出现过的数都变成了 min + 1 \min +1 min + 1 ,在下一段也一定会操作,以此类推。不难发现这两个条件加起来就是充要的。
然后就可以 dp 了。设 d p i dp_i d p i 表示前 i i i 位最少分多少段。贪心地,考虑最后一段 [ p , i ] [p,i] [ p , i ] 时,p p p 越小越好。找到最小的合法的 p p p 转移即可。
此外,最后一段不一定要满足上述第二个条件。最后枚举倒数第二段的结尾位置,找到 d p i dp_i d p i 最小,其次 i i i 最大的。这样使得每个位置都取到了能取到的最小值,自然也最小化了字典序。
最后得到所有数的最终值,倒过来模拟一边即可。O ( n ) O(n) O ( n ) 的!太厉害了。
[ARC130F] Replace by Average ◊ \color{blue}\Diamond ◊ (*3211)
又独立切铜牌题了!
首先有一个显然的结论:如果操作可以使某个 a i a_i a i 变小,则进行操作一定不劣 ,原因显然。
然后,经过大力手玩和瞪眼观察可以发现一个非常厉害的结论:最终的序列是下凸的 。考虑如果不是,一定 ∃ i , a i − a i − 1 ≥ a i + 1 − a i \exists i,a_i-a_{i-1}\ge a_{i+1}-a_i ∃ i , a i − a i − 1 ≥ a i + 1 − a i 即 a i ≥ a i − 1 + a i + 1 2 a_i\ge \frac{a_{i-1}+a_{i+1}}2 a i ≥ 2 a i − 1 + a i + 1 ,操作完后一定不劣。◊ \color{blue}\Diamond ◊ 类似这样 a i + a j 2 \frac{a_i+a_j}2 2 a i + a j 或者有类似关系的都可以尝试从凸性去分析,以及在考虑一个序列的整体时可以尝试考虑凸性。
再然后,还有一个很显然但是至关重要的结论:如果固定 [ l , r ] [l,r] [ l , r ] ,只在 [ l , r ] [l,r] [ l , r ] 内选 i , j i,j i , j 进行操作的话,差分数组 b i = a i − a i − 1 b_i=a_i-a_{i-1} b i = a i − a i − 1 的 ∑ l < i ≤ r b i \sum_{l<i\le r}b_i ∑ l < i ≤ r b i 是不变的 。原因也显然,因为和就等于 a r − a l a_r-a_l a r − a l 。
有了这些结论就可以开始做了。考虑每次加入一个 a i a_i a i ,序列如何变化。因为每次增量可以看作是先把前面能操作的做了,再加入,符合性质一,于是是正确的。显然可以通过若干次调整使序列满足条件,但是时间复杂度不能接受。
这时发现下凸等价于 b i ≤ b i + 1 b_i\le b_{i+1} b i ≤ b i + 1 ,也就是说,加入 a k a_k a k 时,只要调整使得 b b b 仍然单调不降即可。
考虑如果 b b b 被影响的区间为 [ j , k ] [j,k] [ j , k ] ,那么这一段的 b b b 会如何变化。首先根据上面的结论三,它们的和不变。于是不难得到一个结论:这一段的 b i b_i b i 都会近似变成 ∑ j ≤ i ≤ k b i k − j + 1 \frac{\sum_{j\le i\le k}b_i}{k-j+1} k − j + 1 ∑ j ≤ i ≤ k b i 。证明可以考虑放在坐标系上,大致就是变成一条线段。当然具体地,可能分成两段,后面一段的值为前面一段的 + 1 +1 + 1 。
剩下的就简单了,考虑用单调栈维护值相同的段,每次 pop 出所有会被影响的段,修改 b b b 的值之后再加进去。时间复杂度 O ( n ) O(n) O ( n ) 。
[ARC131C] Zero XOR △ \color{blue}\triangle △ (*1162)
会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!会不了一点!
结论:如果 n m o d 2 = 1 n\bmod 2=1 n m o d 2 = 1 则先手必胜,否则若一步能获胜则先手胜,否则后手胜。
证明:令当前全部数异或和为 s s s ,则若先手操作 x x x 后,后手可以操作 y y y 一步获胜,则 x ⊕ y = s x\oplus y=s x ⊕ y = s ,注意到数列中的数两两不同,即这样的 x , y x,y x , y 最劣情况下两两配对。由于 n m o d 2 = 1 n\bmod 2=1 n m o d 2 = 1 ,一定有一个数没有配对,后手再操作一个数,则变成了 n − 2 n-2 n − 2 的情况。
[ARC131D] AtArcher (*2271)
考虑先把每个区间一定造成的贡献算上,若区间可能造成多一次的贡献,则考虑第一个 > 0 >0 > 0 的位置,对应的位置一定是一段区间。差分维护。其次还要分讨左右两边放多少个,总之就是分讨就完了。。。
[ARC131E] Christmas Wreath (*2314)
考虑没有异色三连星(?)等价于有每个环有两条同色边,钦定这两条边都和其中编号最大的相连,则要求变成每个点和所有小于它的点相连的边都同色。暴力背包 O ( n 5 ) O(n^5) O ( n 5 ) 能过?
为什么是对的?首先 n ≤ 4 n\le 4 n ≤ 4 或 n m o d 3 = 2 n\bmod 3=2 n m o d 3 = 2 的时候无解,否则考虑一个 O ( n ) O(n) O ( n ) 做法。发现 n = 6 , 7 , 9 , 10 n=6,7,9,10 n = 6 , 7 , 9 , 1 0 时可以玩出解,n > 10 n>10 n > 1 0 时找到对应的 n − 6 n-6 n − 6 的情况构造即可。所以所有又解情况都可以用这种方式构造。真是蠢完了/qd
[ARC131F] ARC Stamp ◊ □ \color{blue}\Diamond\Box ◊ □ (*3501)
还是很有趣的吧?
首先考虑操作等价于选择一个 ARC 并将这三个位置变为通配符,则来的这三个位置一定只能是 ARC,AR*,A**,**C,*RC,*R* 中的一种。◊ □ \color{blue}\Diamond\Box ◊ □ 考虑将原串分割成上面的串或者分隔符的形式,然后考虑 dp。
思考:为什么不直接在原串上 dp?
感觉可能也可以,但是涉及到的状态很多,分讨起来很麻烦,似乎类似构建一个自动机?
考虑如何 dp,由于分段是形如 (A/AR)ARC(C/RC) 或者是 ...CRA... 的形状,这其中除了 ARC 都要求其他的某些位置已经被操作,所以考虑设 d p i , j , 0 / 1 dp_{i,j,0/1} d p i , j , 0 / 1 表示当前枚举到 i i i ,已经用了 j j j 次操作,是否钦定下一段一定选。
考虑如何去重,其实就是一个简单的原则:不进行无用操作。显然如果操作完后和原串一样则可能是无用的,但是要考虑到,比如 ARARCC 中的 AR 或 C,这两段都要求中间的 ARC 要操作,则此时 ARC 就算操作完还一样也是有意义的。于是对于每一段判断这段是否可以操作完不变,乘上转移系数即可。
[ARC132C] Almost Sorted ∇ \color{blue}\nabla ∇ (*1616)
经典题,之前还给学弟讲了一次。注意到 d d d 很小,所以 p i p_i p i 的可能值只有 2 d + 1 2d+1 2 d + 1 种,并且还是一个以 i i i 为中心的区间,于是考虑动态地状压记录这个区间内哪些数已经被选过然后转移即可。
[ARC132D] Between Two Binary Strings (*2221)
首先相邻相同的位置最多等价于连续段数量最少。先思考怎样的一个序列是合法的,考虑每一个 1 1 1 ,知道了它的起点终点,则这个 1 1 1 在这段区间中就是合法的。
那就将问题转化为了,每个 1 1 1 有一个限制 [ l i , r i ] [l_i,r_i] [ l i , r i ] 将 1 1 1 分成若干个段,使得每段都 ∃ j , ∀ k , l k ≤ j + k − 1 ≤ r k \exists j,\forall k,l_k\le j+k-1\le r_k ∃ j , ∀ k , l k ≤ j + k − 1 ≤ r k 。还是不好处理,于是令 l i → l i − i , r i → r i − i l_i\to l_i-i,r_i\to r_i-i l i → l i − i , r i → r i − i ,则变成了这一段中区间交集不为空。注意到这个东西有单调性,于是直接双指针,再随便用个数据结构维护区间 max l i \max l_i max l i 和 min r i \min r_i min r i 即可。
[ARC132E] Paw ◊ △ \color{blue}\Diamond\triangle ◊ △ (*3144)
逆天诈骗题,应该多想一会儿的。
◊ △ \color{blue}\Diamond\triangle ◊ △ 考虑最终状态,发现一定形如 <<<<<*******>>>>>,中间一段没有被操作过。于是可以对每两个洞之间的段统计有多少种方案中,这一段不会被操作。不难发现这只和左/右洞的数量有关。
设 d p i dp_i d p i 表示有 i i i 个洞,且操作不影响到右边的概率。转移考虑第一次操作,若第一次操作就影响了,则这一次操作一定是操作最右边的洞,且向右走。概率为 1 2 i \frac 1{2i} 2 i 1 。然后可以将操作的洞和段删掉,变成 i − 1 i-1 i − 1 的子问题。于是 d p i = 1 2 i d p i − 1 dp_i=\frac1{2i}dp_{i-1} d p i = 2 i 1 d p i − 1 。最后枚举段统计答案即可。
[ARC132F] Takahashi The Strongest ◊ △ \color{blue}\Diamond\triangle ◊ △ (*3076)
很 educational 的题,做完之后对 FWT 有了更深的理解。
首先考虑 C 是绝对赢家当且仅当 AB 出的一样,并且 C 出的可以获胜。那么第一步就是要求出 AB 每一轮出的是否相同/出的是什么的每种情况的方案数。但是如果直接枚举复杂度会到 O ( 9 k ) O(9^k) O ( 9 k ) 。
但是注意到这个求方案数的问题相当于求 c i = ∑ j ⊗ k = i a j b k c_i=\sum_{j\otimes k=i}a_jb_k c i = ∑ j ⊗ k = i a j b k ,其中 ⊗ \otimes ⊗ 是某种运算,整体上是卷积形式。◊ \color{blue}\Diamond ◊ 具体地,我们将每轮的决策压成四进制形式,定义 x ⊗ y = { x x = y ∧ x , y = 3 3 x = y x\otimes y=\begin{cases}x&x=y\wedge x,y\not=3\\3&x\not=y\end{cases} x ⊗ y = { x 3 x = y ∧ x , y = 3 x = y ,该运算是对 x , y x,y x , y 的每个四进制位分别做。然后进行 FWT,具体地,我们构造 f w t ( a ) i = ∑ j ⊗ i = i a j fwt(a)_i=\sum_{j\otimes i=i}a_j f w t ( a ) i = ∑ j ⊗ i = i a j ,由于 ( i ⊗ j ) ⊗ ( i ⊗ k ) = i ⊗ ( j ⊗ k ) (i\otimes j)\otimes(i\otimes k)=i\otimes(j\otimes k) ( i ⊗ j ) ⊗ ( i ⊗ k ) = i ⊗ ( j ⊗ k ) 所以是可行的,然后 FWT 和 IFWT 都是简单的。
现在已经知道 AB 每种决策会出现的情况数了,然后就要求 C 每种决策的合法情况数。(如果我没想错的话)应该是可以直接容斥的。◊ \color{blue}\Diamond ◊ 但是还有一个很巧妙的方法:逐位处理。其实本质上和 FWT 相同,就是每次将当前位从原来 AB 的决策数变成 C 的决策数。把存在一轮是绝对赢家变成没有一轮是,然后通过一个 dp 就可以简单解决。最后复杂度是 O ( 4 k k ) O(4^kk) O ( 4 k k ) 。
这里插播一道题。
CF2031D Penchick and Desert Rabbit ◊ \color{blue}\Diamond ◊
一个经典结论:对于这样逆序对/顺序对间连边的东西,一个联通块是一个连续段。证明考虑若 i , j i,j i , j 之间有边,则 ( i , j ) (i,j) ( i , j ) 中数一定会和 i , j i,j i , j 中至少一个有边。于是找出每个连续段再算最大值即可。
为什么又是见过的 trick 不会?红温了。
[ARC133C] Row Column Sums (*1583)
先判无解,然后考虑从全 k − 1 k-1 k − 1 改,设每行每列分别要减掉的值为 c i , d i c_i,d_i c i , d i ,则最少要减掉的就是 max ∑ c i , ∑ d i \max\sum c_i,\sum d_i max ∑ c i , ∑ d i 。这显然是答案的上界,构造证明考虑不妨设 ∑ c i < ∑ d i \sum c_i<\sum d_i ∑ c i < ∑ d i 。则先把 ∑ c i \sum c_i ∑ c i 全部填完,并且在超过 d d d 的条件。而剩下 ∑ d i − ∑ c i \sum d_i-\sum c_i ∑ d i − ∑ c i 则可以全部放在一行里,将每个 d d d 补充完。由于优解,所以这个值一定是 k k k 的倍数,从而不会影响 c c c 。
[ARC133D] Range XOR (*2658)
首先 ⨁ l ≤ i ≤ r i = V \bigoplus_{l\le i\le r} i=V ⨁ l ≤ i ≤ r i = V 的条件很难处理,考虑差分,记 f n = ⨁ i ≤ n i f_n=\bigoplus_{i\le n} i f n = ⨁ i ≤ n i ,则变成 f l − 1 ⊕ f r = V f_{l-1}\oplus f_r=V f l − 1 ⊕ f r = V 。而根据经典结论,求单个 f i f_i f i 是简单的,具体地,f i = { i i m o d 4 = 0 1 i m o d 4 = 1 i + 1 i m o d 4 = 2 0 i m o d 4 = 3 f_i=\begin{cases}i&i\bmod 4=0\\1&i\bmod 4=1\\i+1&i\bmod 4=2\\0&i\bmod 4=3\end{cases} f i = ⎩ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎧ i 1 i + 1 0 i m o d 4 = 0 i m o d 4 = 1 i m o d 4 = 2 i m o d 4 = 3 。
所以先把 l = L l=L l = L 和 r = R r=R r = R 的情况判掉,要求的就是 ∑ L ≤ i < j ≤ R [ f i ⊕ f j = V ] \sum_{L\le i<j\le R}[f_i\oplus f_j=V] ∑ L ≤ i < j ≤ R [ f i ⊕ f j = V ] 。再分成两部分:i , j i,j i , j 中有 m o d 2 = 1 \bmod 2=1 m o d 2 = 1 的情况和没有的。有的情况,考虑算出来 [ L , R ] [L,R] [ L , R ] 内 0 / 1 0/1 0 / 1 的数量再判断 [ L , R ] [L,R] [ L , R ] 内是否有 V / V ⊕ 1 V/V\oplus 1 V / V ⊕ 1 。
对于没有的情况,发现限制相当于选这个范围中两个数 m o d 4 = 0 / 3 \bmod 4=0/3 m o d 4 = 0 / 3 的数 x , y x,y x , y ,x ⊕ y = V x\oplus y=V x ⊕ y = V 的情况数。于是直接考虑去掉最后一位,L , R , V L,R,V L , R , V 相应调整,问题就变成了 ∑ L ′ ≤ i < j ≤ R ′ [ i ⊕ j = V ′ ] \sum_{L'\le i<j\le R'}[i\oplus j=V'] ∑ L ′ ≤ i < j ≤ R ′ [ i ⊕ j = V ′ ] 。直接数位 dp 即可。
非常好题。考虑一般和中位数相关的问题,我们的做法都是,令中位数为 k k k ,则让 > k >k > k 的为 1 1 1 ,≤ k \le k ≤ k 的为 0 0 0 ,然后变成 01 01 0 1 序列上的问题。◊ □ \color{blue}\Diamond\Box ◊ □ 对于计数问题也是类似的,考虑 x = ∑ i ≥ 0 [ x > i ] x=\sum_{i\ge 0}[x>i] x = ∑ i ≥ 0 [ x > i ] ,于是可以枚举 0 ≤ k ≤ V 0\le k\le V 0 ≤ k ≤ V ,将 > k >k > k 的变成 1 1 1 ,≤ k \le k ≤ k 的为 0 0 0 ,对于每个 k k k 算答案,加起来就是真正的答案。
此时就考虑如何算答案。由于是 01 01 0 1 序列,所以 x x x 和 y , z y,z y , z 取中位数时,如果 y = z y=z y = z 则变成 y y y ,否则还是 x x x 不变。于是如果序列里出现了 ( 0 , 0 ) (0,0) ( 0 , 0 ) 或 ( 1 , 1 ) (1,1) ( 1 , 1 ) ,最终值就和初始值无关了,只跟最后一次出现的这样的对有关。
但是直接对这个计数是困难的,◊ \color{blue}\Diamond ◊ 于是考虑一些性质,由于是 01 01 0 1 序列相关的计数,考虑 0 , 1 0,1 0 , 1 某种程度上是对称的,具体地,设最后一次出现的相同对是 ( 0 , 0 ) / ( 1 , 1 ) (0,0)/(1,1) ( 0 , 0 ) / ( 1 , 1 ) 的情况数是 f ( k , 0 / 1 ) f(k,0/1) f ( k , 0 / 1 ) ,则 f ( k , 0 ) = f ( V − k , 1 ) f(k,0)=f(V-k,1) f ( k , 0 ) = f ( V − k , 1 ) ,也就是说,每个最后是 ( 0 , 0 ) (0,0) ( 0 , 0 ) 的序列都和某个最后是 ( 1 , 1 ) (1,1) ( 1 , 1 ) 的序列一一对应。所以,我们只需要求出不存在相同对的方案数,存在的答案就是 ( k + 1 ) V n + m 2 \frac{(k+1)V^{n+m}}2 2 ( k + 1 ) V n + m !
现在就只用求序列中不存在相同对的情况数。考虑将 ( x , y ) (x,y) ( x , y ) 对中的 y → y ⊕ 1 y\to y\oplus 1 y → y ⊕ 1 ,也就是变成了 x , y x,y x , y 序列完全相同,并且同时有长为 n , m n,m n , m 的循环节。所以序列一定有长为 g = gcd ( n , m ) g=\gcd(n,m) g = g cd( n , m ) 的循环节。对于循环节的每一位,若 x = 0 , y = 1 x=0,y=1 x = 0 , y = 1 则方案数为 k n g ( V − k ) m g k^{\frac ng}(V-k)^{\frac mg} k g n ( V − k ) g m ,否则为 k m g ( V − k ) n g k^{\frac mg}(V-k)^{\frac ng} k g m ( V − k ) g n ,所以总的方案数为 ( k n g ( V − k ) m g + k m g ( V − k ) n g ) g (k^{\frac ng}(V-k)^{\frac mg}+k^{\frac mg}(V-k)^{\frac ng})^g ( k g n ( V − k ) g m + k g m ( V − k ) g n ) g 。
[ARC134C] The Majority (*1560)
先把除了 1 1 1 之外的填好,那么每个非 1 1 1 的都要对应一个 1 1 1 ,剩下的 1 1 1 随便填即可。
[ARC134D] Concatenate Subsequences (*1998)
先考虑在 [ 1 , n ] [1,n] [ 1 , n ] 中的部分,这部分中的元素显然单调不降,否则把降的部分删掉更优。记 f i = min j ≥ i a j f_i=\min_{j\ge i}a_j f i = min j ≥ i a j 然后分类讨论:
若 ∃ i , a i = f 1 ∧ a i ≥ a i + n \exists i,a_i=f_1\wedge a_i\ge a_{i+n} ∃ i , a i = f 1 ∧ a i ≥ a i + n ,那么只留一个 a i a_i a i 和可行的最小的 a i + n a_{i+n} a i + n 即可。
否则不断加入 a i = f i a_i=f_i a i = f i 的数,令第一个选的 a i + n = x a_{i+n}=x a i + n = x ,分类讨论:
若 a i > x a_i>x a i > x ,显然不优,直接结束。
否则若 a i < x a_i<x a i < x ,直接加入。
否则 a i = x a_i=x a i = x ,那么考虑加入的第一个 = x \not=x = x 的 a i + n a_{i+n} a i + n 和 x x x 的大小关系,判断是否加入即可。
[ARC134E] Modulo Nim ∇ \color{blue}\nabla ∇ (*3026)
考虑先分析简单的情况。设数的集合为 S S S 。则:
若 ∣ S ∣ = 1 |S|=1 ∣ S ∣ = 1 ,则 { 1 } , { 2 } \{1\},\{2\} { 1 } , { 2 } 显然必败,否则考虑 x m o d ( x − 1 ) = 1 x\bmod (x-1)=1 x m o d ( x − 1 ) = 1 ,必胜。
若 ∃ x ∈ S , x m o d 2 = 1 \exists x\in S,x\bmod 2=1 ∃ x ∈ S , x m o d 2 = 1 ,选 m o d 2 \bmod 2 m o d 2 ,必胜。同理当 ∃ x ∈ S , x m o d 4 = 2 \exists x\in S,x\bmod 4=2 ∃ x ∈ S , x m o d 4 = 2 时必胜。
否则若 m o d 3 \bmod 3 m o d 3 后 S = { 1 } , { 2 } S=\{1\},\{2\} S = { 1 } , { 2 } 则必胜。
否则 m o d 12 \bmod 12 m o d 1 2 后,S = { 4 , 8 } S=\{4,8\} S = { 4 , 8 } 。{ 4 , 8 } \{4,8\} { 4 , 8 } 可以玩出来是必败,则原来不为 { 4 , 8 } \{4,8\} { 4 , 8 } 的情况必胜。
剩下 ∀ x ∈ S , 12 ∣ x \forall x\in S,12\mid x ∀ x ∈ S , 1 2 ∣ x 的情况,发现这样的 x x x 最多只有 16 16 1 6 个,直接状压,记录当前 S S S 中有哪些 12 ∣ x 12|x 1 2 ∣ x 的 x x x ,边界情况为 ∃ x ∈ S , 12 ∣ x \exists x\in S,12\not\mid x ∃ x ∈ S , 1 2 ∣ x 的情况。
[ARC135C] XOR to All ∇ \color{blue}\nabla ∇ (*1512)
不难发现操作两次及以上一定不优,于是枚举操作哪一个拆位算贡献即可。
[ARC135D] Add to Square ◊ □ \color{blue}\Diamond\Box ◊ □ (*2750)
其实就差了中间一个挺妙的转化,最后结论都大致猜到了(
考虑将 ( i + j ) m o d 2 = 1 (i+j)\bmod 2=1 ( i + j ) m o d 2 = 1 的 ( i , j ) (i,j) ( i , j ) 位置上的元素 × ( − 1 ) \times(-1) × ( − 1 ) ,答案不变的同时,容易发现操作不会影响每行每列的和。于是令第 i i i 行的和为 f i f_i f i ,第 i i i 列的和为 g i g_i g i ,则答案有一个显然的下界为 max ( ∑ ∣ f i ∣ , ∑ ∣ g i ∣ ) \max(\sum |f_i|,\sum |g_i|) max ( ∑ ∣ f i ∣ , ∑ ∣ g i ∣ ) 。
同时还有一个很重要的观察:◊ □ \color{blue}\Diamond\Box ◊ □ 此时,若两个矩阵的 f i , g i f_i,g_i f i , g i 全部相同,则一定可以互相转化。证明考虑可以操作使得左上 ( n − 1 ) × ( m − 1 ) (n-1)\times (m-1) ( n − 1 ) × ( m − 1 ) 的矩阵全部为 0 0 0 ,剩下的元素是固定的,于是可以通过这个中间状态变成所有状态。
考虑答案是否能取到这个下界。不妨令其为 ∑ ∣ f i ∣ \sum|f_i| ∑ ∣ f i ∣ 。则要求就是第 i i i 行的所有数和 f i f_i f i 同号。若 ∃ i , j , f i > 0 , g j > 0 \exists i,j,f_i>0,g_j>0 ∃ i , j , f i > 0 , g j > 0 ,则令 a i , j = min ( f i , g j ) a_{i,j}=\min(f_i,g_j) a i , j = min ( f i , g j ) ,同理当 f i < 0 , g j < 0 f_i<0,g_j<0 f i < 0 , g j < 0 的时候一样。
进行完这些操作后 g i g_i g i 一定全部 = 0 =0 = 0 ,剩下的 f i f_i f i 之和也一定为 0 0 0 (因为 ∑ f i = ∑ g i \sum f_i=\sum g_i ∑ f i = ∑ g i )。于是随便找一列,每次找一个 f i > 0 , f j < 0 f_i>0,f_j<0 f i > 0 , f j < 0 ,将其中绝对值较小那个消成 0 0 0 即可。
[ARC135E] Sequence of Multiples ∇ \color{blue}\nabla ∇ (*3157)
细节不太想重新理解了,大概就是,观察到不同的 a i i − a i − 1 i − 1 \frac{a_i}i-\frac{a_{i-1}}{i-1} i a i − i − 1 a i − 1 只有 O ( X 3 ) O(\sqrt[3]X) O ( 3 X ) 个,然后类似整除分块,找到每一段然后算。
[ARC135F] Delete 1, 4, 7, ... ◊ □ \color{blue}\Diamond\Box ◊ □ (*3821)
太牛了,尝试不看题解再把式子推一遍。
首先不难发现当 k k k 比较大的时候最后的 n k n_k n k 很小,具体当 k = 40 , n 0 = 1 0 14 k=40,n_0=10^{14} k = 4 0 , n 0 = 1 0 1 4 时,n k < 1 0 7 n_k<10^7 n k < 1 0 7 。于是考虑是否可以求出每个位置上的元素。设进行 k k k 次操作后的 a i a_i a i 为 f k ( i ) f_k(i) f k ( i ) ,可以得到 f k ( i ) = f k − 1 ( ⌊ 3 i + 1 2 ⌋ ) f_k(i)=f_{k-1}(\left\lfloor\frac{3i+1}2\right\rfloor) f k ( i ) = f k − 1 ( ⌊ 2 3 i + 1 ⌋ ) 。于是可以 O ( k n ( 2 3 ) k ) O(kn(\frac23)^k) O ( k n ( 3 2 ) k ) 解决。
否则 k < 40 k<40 k < 4 0 。□ \color{blue}\Box □ 尝试打表可以发现,f k ( i + 2 k ) = f k ( i ) + 3 k f_k(i+2^k)=f_k(i)+3^k f k ( i + 2 k ) = f k ( i ) + 3 k 。证明考虑归纳。首先 k = 0 k=0 k = 0 显然正确。然后
f k ( i + 2 k ) = f k − 1 ( ⌊ 3 i + 1 2 ⌋ + 3 × 2 k − 1 ) = f k − 1 ( ⌊ 3 i + 1 2 ⌋ ) + 3 k = f k ( i ) + 3 k f_k(i+2^k)\\
=f_{k-1}(\left\lfloor\frac{3i+1}2\right\rfloor+3\times 2^{k-1})\\
=f_{k-1}(\left\lfloor\frac{3i+1}2\right\rfloor)+3^k\\
=f_k(i)+3^k
f k ( i + 2 k ) = f k − 1 ( ⌊ 2 3 i + 1 ⌋ + 3 × 2 k − 1 ) = f k − 1 ( ⌊ 2 3 i + 1 ⌋ ) + 3 k = f k ( i ) + 3 k
◊ \color{blue}\Diamond ◊ 这是一个非常厉害的性质,由于 2 k 2^k 2 k 的存在可以做很多类似倍增的操作。
此时已经有一个 O ( k 2 k ) O(k2^k) O ( k 2 k ) 的做法了:由于知道 f k ( i ) f_k(i) f k ( i ) 就能知道 f k ( i + 2 k ) f_k(i+2^k) f k ( i + 2 k ) ,考虑枚举 i ∈ [ 0 , 2 k ) i\in[0,2^k) i ∈ [ 0 , 2 k ) 算 f k ( i ) f_k(i) f k ( i ) 就能等比数列求和得到 ∑ f k ( i ) \sum f_k(i) ∑ f k ( i ) 。
但是还不够,由于 k ≤ 40 k\le 40 k ≤ 4 0 ,联想到折半,考虑设 x = ⌊ k 2 ⌋ , y = ⌈ k 2 ⌉ x=\left\lfloor\frac k2\right\rfloor,y=\left\lceil\frac k2\right\rceil x = ⌊ 2 k ⌋ , y = ⌈ 2 k ⌉ ,则要求的就是 ∑ f y ( f x ( i ) ) \sum f_y(f_x(i)) ∑ f y ( f x ( i ) ) 。
∑ i = 1 n k f y ( f x ( i ) ) = ∑ i = 0 2 x − 1 ∑ j = 0 ⌊ n k 2 x ⌋ f y ( f x ( i + j 2 x ) ) = ∑ i = 0 2 x − 1 ∑ j = 0 ⌊ n k 2 x ⌋ f y ( f x ( i ) + j 3 x ) \sum_{i=1}^{n_k}f_y(f_x(i))\\
=\sum_{i=0}^{2^x-1}\sum_{j=0}^{\left\lfloor\frac{n_k}{2^x}\right\rfloor}f_y(f_x(i+j2^x))\\
=\sum_{i=0}^{2^x-1}\sum_{j=0}^{\left\lfloor\frac{n_k}{2^x}\right\rfloor}f_y(f_x(i)+j3^x)
i = 1 ∑ n k f y ( f x ( i ) ) = i = 0 ∑ 2 x − 1 j = 0 ∑ ⌊ 2 x n k ⌋ f y ( f x ( i + j 2 x ) ) = i = 0 ∑ 2 x − 1 j = 0 ∑ ⌊ 2 x n k ⌋ f y ( f x ( i ) + j 3 x )
然后设 F ( a , b ) = ∑ i = 0 a f y ( b + i 3 x ) F(a,b)=\sum\limits_{i=0}^{a}f_y(b+i3^x) F ( a , b ) = i = 0 ∑ a f y ( b + i 3 x ) ,则以原式 = ∑ i = 0 2 x − 1 F ( ⌊ n k 2 x ⌋ , f x ( i ) ) =\sum\limits_{i=0}^{2^x-1}F(\left\lfloor\frac{n_k}{2^x}\right\rfloor,f_x(i)) = i = 0 ∑ 2 x − 1 F ( ⌊ 2 x n k ⌋ , f x ( i ) ) 。考虑类似倍增,拆成若干个 [ s , s + 2 t − 1 ] [s,s+2^t-1] [ s , s + 2 t − 1 ] 的区间,则有
∑ i = s s + 2 t − 1 f y ( a + i 3 x ) = ∑ i = 0 2 t − 1 f y ( a + ( i + s ) 3 x ) = ∑ i = 0 2 t − 1 f y ( a + s 3 x + i 3 x ) \sum_{i=s}^{s+2^t-1}f_y(a+i3^x)\\
=\sum_{i=0}^{2^t-1}f_y(a+(i+s)3^x)\\
=\sum_{i=0}^{2^t-1}f_y(a+s3^x+i3^x)
i = s ∑ s + 2 t − 1 f y ( a + i 3 x ) = i = 0 ∑ 2 t − 1 f y ( a + ( i + s ) 3 x ) = i = 0 ∑ 2 t − 1 f y ( a + s 3 x + i 3 x )
则设 g ( a , b ) = ∑ i = 0 2 a − 1 f y ( b + i 3 x ) g(a,b)=\sum\limits_{i=0}^{2^a-1}f_y(b+i3^x) g ( a , b ) = i = 0 ∑ 2 a − 1 f y ( b + i 3 x ) ,则只需要求出所有的 g ( a , b ) g(a,b) g ( a , b ) 即可。但是注意到 b b b 可能很大,所以再简化一点。设 u = b m o d 2 x , v = ⌊ b 2 x ⌋ u=b\bmod 2^x,v=\left\lfloor\frac b{2^x}\right\rfloor u = b m o d 2 x , v = ⌊ 2 x b ⌋ 。则
g ( a , b ) = ∑ i = 0 2 a − 1 f y ( u + 2 x v + i 3 x ) = ∑ i = 0 2 a − 1 f y ( u + i 3 x ) + 3 x v = 2 a 3 x v + ∑ i = 0 2 a − 1 f y ( u + i 3 x ) g(a,b)\\
=\sum_{i=0}^{2^a-1}f_y(u+2^xv+i3^x)\\
=\sum_{i=0}^{2^a-1}f_y(u+i3^x)+3^xv\\
=2^a3^xv+\sum_{i=0}^{2^a-1}f_y(u+i3^x)
g ( a , b ) = i = 0 ∑ 2 a − 1 f y ( u + 2 x v + i 3 x ) = i = 0 ∑ 2 a − 1 f y ( u + i 3 x ) + 3 x v = 2 a 3 x v + i = 0 ∑ 2 a − 1 f y ( u + i 3 x )
这样就有 u < 2 x u<2^x u < 2 x 了,于是 g ( a , b ) g(a,b) g ( a , b ) 的状态数就是 O ( 2 k 2 log n ) O(2^{\frac k2}\log n) O ( 2 2 k log n ) 的了。
然后就考虑求 g ( a , b ) g(a,b) g ( a , b ) 。还是类似倍增的,考虑从 g ( a − 1 , ∗ ) g(a-1,*) g ( a − 1 , ∗ ) 转移过来:
g ( a , b ) = ∑ i = 0 2 a − 1 f y ( b + i 3 x ) = ∑ i = 0 2 a − 1 − 1 f y ( b + i 3 x ) + ∑ i = 0 2 a − 1 − 1 f y ( b + ( i + 2 a − 1 ) 3 x ) = ∑ i = 0 2 a − 1 − 1 f y ( b + i 3 x ) + ∑ i = 0 2 a − 1 − 1 f y ( b + 2 a − 1 3 x + i 3 x ) = g ( a − 1 , b ) + g ( a − 1 , b + 2 a − 1 3 x ) g(a,b)\\
=\sum_{i=0}^{2^a-1}f_y(b+i3^x)\\
=\sum_{i=0}^{2^{a-1}-1}f_y(b+i3^x)+\sum_{i=0}^{2^{a-1}-1}f_y(b+(i+2^{a-1})3^x)\\
=\sum_{i=0}^{2^{a-1}-1}f_y(b+i3^x)+\sum_{i=0}^{2^{a-1}-1}f_y(b+2^{a-1}3^x+i3^x)\\
=g(a-1,b)+g(a-1,b+2^{a-1}3^x)
g ( a , b ) = i = 0 ∑ 2 a − 1 f y ( b + i 3 x ) = i = 0 ∑ 2 a − 1 − 1 f y ( b + i 3 x ) + i = 0 ∑ 2 a − 1 − 1 f y ( b + ( i + 2 a − 1 ) 3 x ) = i = 0 ∑ 2 a − 1 − 1 f y ( b + i 3 x ) + i = 0 ∑ 2 a − 1 − 1 f y ( b + 2 a − 1 3 x + i 3 x ) = g ( a − 1 , b ) + g ( a − 1 , b + 2 a − 1 3 x )
于是设 B = 40 B=40 B = 4 0 ,复杂度 O ( k n ( 2 3 ) k + 2 B 2 ( B + log n ) ) O(kn(\frac23)^k+2^{\frac B2}(B+\log n)) O ( k n ( 3 2 ) k + 2 2 B ( B + log n ) ) ,做完了。
推式子成功了
[ARC136C] Circular Addition (*2137)
首先区间加不难联想到差分。于是设 b i = a i m o d n + 1 − a i b_i=a_{i \bmod n+1}-a_i b i = a i m o d n + 1 − a i ,则每次操作形如选 b i ← b i − 1 , b j ← b j + 1 b_i\leftarrow b_i-1,b_j\leftarrow b_j+1 b i ← b i − 1 , b j ← b j + 1 。则有个下界为 ∑ [ b i > 0 ] b i \sum[b_i>0]b_i ∑ [ b i > 0 ] b i 。还有另一个显然的下界为 max a i \max a_i max a i 。
接下来证明答案就是这两个下界取 max \max max 。若前者更大,则每次选随便一个 b i > 0 , b j < 0 b_i>0,b_j<0 b i > 0 , b j < 0 。否则,若 a i a_i a i 全部相同,则整个操作,否则一定能找到 a i − 1 < a i , a j + 1 < a j a_{i-1}<a_i,a_{j+1}<a_j a i − 1 < a i , a j + 1 < a j 。操作即可。
[ARC136D] Without Carry ∇ \color{blue}\nabla ∇ (*1908)
直接高维前缀和,记 f a , b , c , d , e , g f_{a,b,c,d,e,g} f a , b , c , d , e , g 为每一位分别 ≤ a , b , c , d , e , g \le a,b,c,d,e,g ≤ a , b , c , d , e , g 的数量,随便预处理一下就行。
[ARC136E] Non-coprime DAG (*3100)
很有趣的小清新题!
首先既然要求反链,那么就肯定要关心一个问题:如何判断 i i i 能否到达 j ( i < j ) j(i<j) j ( i < j ) ?
若 i , j i,j i , j 均为偶数,显然 i , j i,j i , j 间就有边。否则,考虑 i i i 为奇数,那么考虑 i i i 的一条出边能到达的点 u u u ,记 i i i 的最小质因数为 f i f_i f i ,则显然有 min u = i + f i \min u=i+f_i min u = i + f i 。对于 j j j 的入边,入点为 v v v 时也是一样,max v = i − f i \max v=i-f_i max v = i − f i 。
同时发现,这样的 v v v 一定是偶数,原因显然。也就是说,若此时 u ≤ v u\le v u ≤ v ,则 i i i 一定可以到达 j j j 。于是设 L i = { i − f i i m o d 2 = 1 i i m o d 2 = 0 , R i = { i + f i i m o d 2 = 1 i i m o d 2 = 0 L_i=\begin{cases}i-f_i&i\bmod 2=1\\i&i\bmod 2=0\end{cases},R_i=\begin{cases}i+f_i&i\bmod 2=1\\i&i\bmod 2=0\end{cases} L i = { i − f i i i m o d 2 = 1 i m o d 2 = 0 , R i = { i + f i i i m o d 2 = 1 i m o d 2 = 0 。则 i i i 可以到达 j j j 当且仅当 R i ≤ L j R_i\le L_j R i ≤ L j 。再把 L i , R i L_i,R_i L i , R i 看作若干个区间 [ L i , R i ) [L_i,R_i) [ L i , R i ) ,则一个点集 S S S 构成反链当且仅当 S S S 中的区间交集不为空。
当然你会发现这个 [ L i , R i ) [L_i,R_i) [ L i , R i ) 在 i m o d 2 = 0 i\bmod 2=0 i m o d 2 = 0 的时候有问题,不过事实上你不能同时选两个这样的 i i i ,于是后面特判一下。
这个问题是简单的,考虑枚举这些区间的交一定包含 [ i , i + 1 ) [i,i+1) [ i , i + 1 ) 这段区间,问题就变成了有多少区间包含 [ i , i + 1 ) [i,i+1) [ i , i + 1 ) ,差分即可。还有可能要选 i m o d 2 = 0 i\bmod 2=0 i m o d 2 = 0 的 i i i ,则此时区间的交一定包含 i i i 这个点,也是统计有多少包含点 i i i 的区间即可。
最后 1 1 1 一定是能选的,加上即可。O ( n ) O(n) O ( n ) 解决。
[ARC137C] Distinct Numbers ◊ \color{blue}\Diamond ◊ (*2043)
看讨论区叫 决策包含性 的东西确实很厉害啊!
结论:若 a n − a n − 1 > 1 a_n-a_{n-1}>1 a n − a n − 1 > 1 则一定先手必胜。考虑 a n ← a n − 1 a_n\leftarrow a_n-1 a n ← a n − 1 的状态,被当前状态完全包含。
◊ \color{blue}\Diamond ◊ Lemma:若有状态 A A A 能一步到达 B B B 且完全包含 B B B ,则 A A A 一定必胜。证明考虑,若 B B B 必败则 A A A 显然必胜。否则 B B B 一定有个后继必败,A A A 能到达这个后继,必胜。
否则考虑 a n − a n − 1 = 1 a_n-a_{n-1}=1 a n − a n − 1 = 1 ,此时双方都不会操作变成 > > > 的状态,于是每次操作一定有 a n = a n − 1 + 1 a_n=a_{n-1}+1 a n = a n − 1 + 1 ,则每次使最大值 − 1 -1 − 1 ,判断奇偶性即可。
[ARC137D] Prefix XORs ◊ ∇ \color{blue}\Diamond\nabla ◊ ∇ (*2191)
考虑计算 a n a_n a n 的值,对每个值 a i a_i a i 分开算贡献。◊ \color{blue}\Diamond ◊ 可以发现 a n ′ = ∑ a n − i ( k + i − 1 i ) a_n'=\sum a_{n-i}\binom{k+i-1}i a n ′ = ∑ a n − i ( i k + i − 1 ) 。证明考虑把 ( n , k ) (n,k) ( n , k ) 看作坐标,则 a n − i a_{n-i} a n − i 的贡献相当于在网格图上从 ( n − i , 1 ) (n-i,1) ( n − i , 1 ) 走到 ( n , k ) (n,k) ( n , k ) 的方案数。因为 s i = ∑ j ≤ i a j s_i=\sum_{j\le i} a_j s i = ∑ j ≤ i a j 可以看作从 ( j , y − 1 ) (j,y-1) ( j , y − 1 ) 先往下一步,再往右走到 ( i , y ) (i,y) ( i , y ) 。
然后考虑异或,则当且仅当 ( k + i − 1 i ) m o d 2 = 1 \binom{k+i-1}i\bmod 2=1 ( i k + i − 1 ) m o d 2 = 1 时有贡献。
◊ \color{blue}\Diamond ◊ Lemma:( n m ) m o d 2 = 1 \binom nm\bmod 2=1 ( m n ) m o d 2 = 1 当且仅当用二进制表示成集合时 m ⊆ n m\subseteq n m ⊆ n 。证明考虑 Lucas 定理:( n m ) = ( n & 1 m & 1 ) × ( ⌊ n 2 ⌋ ⌊ m 2 ⌋ ) \binom nm=\binom{n\&1}{m\&1}\times\binom{\left\lfloor\frac n2\right\rfloor}{\left\lfloor\frac m2\right\rfloor} ( m n ) = ( m & 1 n & 1 ) × ( ⌊ 2 m ⌋ ⌊ 2 n ⌋ ) ,其实也就是拆位,每位做。所以要求就是每位都有 ( n m ) = 1 \binom nm=1 ( m n ) = 1 ,不难发现当且仅当 ( n , m ) = ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , 1 ) (n,m)=(0,0),(1,0),(1,1) ( n , m ) = ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , 1 ) 时成立,即 m ⊆ n m\subseteq n m ⊆ n 。
所以 ( k + i − 1 i ) m o d 2 = 1 \binom{k+i-1}i\bmod 2=1 ( i k + i − 1 ) m o d 2 = 1 当且仅当 ( k − 1 ) & i = 0 (k-1)\&i=0 ( k − 1 ) & i = 0 。可以暴力对于每个 k − 1 k-1 k − 1 枚举子集的补集 O ( 3 log n ) O(3^{\log n}) O ( 3 log n ) ,也可以高维前缀和 O ( n log n ) O(n\log n) O ( n log n ) 。
[ARC137E] Bakery ◊ □ \color{blue}\Diamond\Box ◊ □ (*3034)
首先这个题面看着就很网络流。考虑建模。◊ □ \color{blue}\Diamond\Box ◊ □ 正向算每天的收益比较困难,考虑先算总收益,再减去最少需要减去的。
然后考虑一个类似志愿者招募的建模:◊ □ \color{blue}\Diamond\Box ◊ □ 我们连一条 1 → n + 1 1\to n+1 1 → n + 1 的链,每个 i → i + 1 i\to i+1 i → i + 1 连 ( a i , D ) , ( l i m − a i , 0 ) (a_i,D),(lim-a_i,0) ( a i , D ) , ( l i m − a i , 0 ) 两条边。经过这条边表示不制作面包。而如果你制作的面包少于 a i a_i a i 个了,则每少制作一个面包就会减少 D D D 的收益。
除此之外还有 l i → r i + 1 l_i\to r_i+1 l i → r i + 1 的 ( 1 , c i ) (1,c_i) ( 1 , c i ) 的边,表示选了第 i i i 个面包师并制作面包。由于这会让 [ l i , r i ] [l_i,r_i] [ l i , r i ] 内的 j → j + 1 j\to j+1 j → j + 1 的边都少 1 1 1 的流量,所以相当于制作了面包。
然后使用 Atcoder library 的网络流库通过。