【Atcoder】AGC007 B-F简要题解

B.Construct Sequences

观察数据范围: a i , b i ≤ 1 0 9 , n ≤ 2 × 1 0 4 a_i,b_i\leq 10^9,n\leq 2\times 10^4 ai,bi109,n2×104

n 2 < 1 0 9 n^2<10^9 n2<109,所以让构造的 a , b a,b a,b公差为 n n n即可。

p i p_i pi就在 a i a_i ai + ( i − 1 ) +(i-1) +(i1)即可。


C.Pushing Balls

辣鸡推式子题!(dp想半天无解)

模拟一轮的操作,发现剩下 n − 1 n-1 n1个球与坑的距离还是个等差数列(具体过程略):
每轮移动期望距离 d + 2 n − 1 2 x d+\dfrac{2n-1}{2x} d+2x2n1,一轮完毕后 d ′ = d + 2 d + 5 x 2 n , x ′ = x + 4 x 2 n d'=d+\dfrac{2d+5x}{2n},x'=x+\dfrac{4x}{2n} d=d+2n2d+5x,x=x+2n4x

所以这道题教会我们:推不出dp就先模拟一轮,说不定变化有规律?


D.Shik and Game

显然最优操作是每次给一段连续区间的熊喂糖,然后回到区间第一只熊的位置依次取硬币,设 f i f_i fi表示最后一个区间以 i i i结尾的最优值,转移如下:
f i = m i n ( f j + max ⁡ ( T , 2 ( x i − x j + 1 ) ) ) f_i=min(f_j+\max(T,2(x_i-x_{j+1}))) fi=min(fj+max(T,2(xixj+1)))

答案即 f n + E f_n+E fn+E

可以单调指针扫到最后一个 j j j满足 2 ( x i − x j + 1 ) ≥ T 2(x_i-x_{j+1})\geq T 2(xixj+1)T,记录前缀和 min ⁡ ( f j − 2 x j + 1 ) \min(f_j-2x_{j+1}) min(fj2xj+1)。对于 2 ( x i − x j + 1 ) < T 2(x_i-x_{j+1})< T 2(xixj+1)<T的部分,由于 f i f_i fi单调不降,所以用 f j + 1 + T f_{j+1}+T fj+1+T更新 f i f_i fi即可。


E.Shik and Travel

再一次zz地忽略了题目中的关键性质:满二叉树…

二分答案 m i d mid mid

因为每条边只能走两次,所以要先选完子树内的叶子结点才能走别的。考虑 d f s dfs dfs遍历这颗树,假设当前处理到 x x x点,它到左右儿子的距离分别为 v 0 , v 1 v_0,v_1 v0,v1

每个结点维护一个数对 ( a , b ) (a,b) (a,b)集合 S x S_x Sx,其中 a , b a,b a,b分别表示根到第一个叶结点的距离和最后一个叶结点到根的距离。

对于点 x x x,若左儿子集合 S l S_l Sl中的 ( a , b ) (a,b) (a,b)和右儿子集合 S r S_r Sr中的 ( a ′ , b ′ ) (a',b') (a,b)满足 b + a ′ + v 0 + v 1 ≤ m i d b+a'+v_0+v_1\leq mid b+a+v0+v1mid,则点 x x x的集合中存在 ( a + v 0 , b ′ + v 1 ) (a+v_0,b'+v_1) (a+v0,b+v1)

强制 ∣ S l ∣ ≤ ∣ S r ∣ |S_l|\leq |S_r| SlSr(不满足的 s w a p ( l , r ) swap(l,r) swap(l,r)即可),对于 ∣ S l ∣ |S_l| Sl中的每个数对 ( a , b ) (a,b) (a,b)
S r S_r Sr中找到满足 b + a ′ + v 0 + v 1 ≤ m i d b+a'+v_0+v_1\leq mid b+a+v0+v1mid b ′ b' b最小的数对 ( a ′ , b ′ ) (a',b') (a,b),将 ( a + v 0 , b ′ + v 1 ) (a+v_0,b'+v_1) (a+v0,b+v1)压入 S x S_x Sx
S r S_r Sr中找到满足 b ′ + a + v 0 + v 1 ≤ m i d b'+a+v_0+v_1\leq mid b+a+v0+v1mid a ′ a' a最小的数对 ( a ′ , b ′ ) (a',b') (a,b),将 ( a ′ + v 1 , b + v 0 ) (a'+v_1,b+v_0) (a+v1,b+v0)压入 S x S_x Sx

∣ S r o o t ∣ > 0 |S_{root}|>0 Sroot>0,则有解。

∣ S x ∣ ≤ 2 ∣ S l ∣ |S_x|\leq 2|S_l| Sx2Sl,类似于启发式合并,时间复杂度 O ( n log ⁡ 2 n ) O(n\log ^2n) O(nlog2n)


F.Shik and Copying String

T T T分成若干个内部字符相同的段。对于每段 [ l , r ] [l,r] [l,r]的开头 l l l,找到最大的 i i i满足 i ≤ l i\leq l il S 0 [ i ] = T [ l ] S_0[i]=T[l] S0[i]=T[l],那么这一段必然由 S 0 [ i ] S_0[i] S0[i]转移而来。

贪心地看,我们应该倒序逐次地转移得到 T T T的每个段:

【Atcoder】AGC007 B-F简要题解_第1张图片
红色表示最终转移到的区间,从上到下依次是 S 0 , S 1 , S 2 , S 3 S_0,S_1,S_2,S_3 S0,S1,S2,S3

特判掉 S 0 = T S_0=T S0=T S l = S i S_l=S_i Sl=Si的情况(答案分别为0,1),那么其它情况都存在折线重叠。

考虑双端队列 q q q维护重叠折线,答案即过程中双端队列大小最大值+1(加上折线到 l l l后拓展到 r r r的一步):

考虑加入当前的点 i i i q [ h e a d ] q[head] q[head]怎样才会限制到 i i i呢?

假设当前加入 3 3 3号点,双端队列中元素为 1 , 2 1,2 1,2,可以发现在 1 1 1的限制下, 3 3 3在第二次转移后最多只能拓展到 q [ h e a d ] − ( h e a d − t a i l ) q[head]-(head-tail) q[head](headtail)的位置——若 l 3 l_3 l3在这个位置之前,那么 q [ h e a d ] q[head] q[head]就限制不到 3 3 3了。

不断弹出队首直至满足 q [ h e a d ] − ( h e a d − t a i l ) ≤ l 3 q[head]-(head-tail)\leq l_3 q[head](headtail)l3或者队列为空,然后将 3 3 3加入队尾。并在过程中不断用 h e a d − t a i l + 1 head-tail+1 headtail+1更新 a n s ans ans

答案即 a n s + 1 ans+1 ans+1

你可能感兴趣的:(妙,atcoder)