观察数据范围: 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,bi≤109,n≤2×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) +(i−1)即可。
辣鸡推式子题!(dp想半天无解)
模拟一轮的操作,发现剩下 n − 1 n-1 n−1个球与坑的距离还是个等差数列(具体过程略):
每轮移动期望距离 d + 2 n − 1 2 x d+\dfrac{2n-1}{2x} d+2x2n−1,一轮完毕后 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就先模拟一轮,说不定变化有规律?
显然最优操作是每次给一段连续区间的熊喂糖,然后回到区间第一只熊的位置依次取硬币,设 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(xi−xj+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(xi−xj+1)≥T,记录前缀和 min ( f j − 2 x j + 1 ) \min(f_j-2x_{j+1}) min(fj−2xj+1)。对于 2 ( x i − x j + 1 ) < T 2(x_i-x_{j+1})< T 2(xi−xj+1)<T的部分,由于 f i f_i fi单调不降,所以用 f j + 1 + T f_{j+1}+T fj+1+T更新 f i f_i fi即可。
再一次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+v1≤mid,则点 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| ∣Sl∣≤∣Sr∣(不满足的 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+v1≤mid且 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+v1≤mid且 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| ∣Sx∣≤2∣Sl∣,类似于启发式合并,时间复杂度 O ( n log 2 n ) O(n\log ^2n) O(nlog2n)
将 T T T分成若干个内部字符相同的段。对于每段 [ l , r ] [l,r] [l,r]的开头 l l l,找到最大的 i i i满足 i ≤ l i\leq l i≤l且 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的每个段:
红色表示最终转移到的区间,从上到下依次是 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]−(head−tail)的位置——若 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]−(head−tail)≤l3或者队列为空,然后将 3 3 3加入队尾。并在过程中不断用 h e a d − t a i l + 1 head-tail+1 head−tail+1更新 a n s ans ans。
答案即 a n s + 1 ans+1 ans+1。