传送门
考虑要么从 n k , \frac n k, kn,或者 n k + 1 \frac n k+1 kn+1变过来,其他一定不优
直接做即可
code
考虑每次暴力松弛是 O ( n 4 ) O(n^4) O(n4),由于每个位置最多松弛 O ( n ) O(n) O(n)次
所以复杂度是 O ( n 3 ) O(n^3) O(n3)的
code
考虑从低位到高位建出一颗三叉树
那么操作分别是交换 1 , 2 1,2 1,2儿子以及
0 , 1 , 2 0,1,2 0,1,2依次换位,递归 0 0 0儿子继续做
这两种
最后还原即可
code
考虑如果询问 s s s得到 a n s = L − s ans=L-s ans=L−s,那么 s s s是原串的子序列
考虑先用 62 62 62次询问出每个字母的出现次数
然后每次可以 ∣ A ∣ + ∣ B ∣ − 1 |A|+|B|-1 ∣A∣+∣B∣−1合并两个子序列
这样即可在要求次数内得到原序列
code
考虑先以最大值断环为链
考虑可以得到一个式子为 f i = max ( a i , ( f i − 1 + f i + 1 ) / 2 − b i ) f_i=\max(a_i,(f_{i-1}+f_{i+1})/2-b_i) fi=max(ai,(fi−1+fi+1)/2−bi)
由于有一个 − b -b −b不好做
考虑找到一个 c c c满足 2 ( c i + b i ) = c i − 1 + c i + 1 2(c_i+b_i)=c_{i-1}+c_{i+1} 2(ci+bi)=ci−1+ci+1
那么令 g = f − c , v = a − c g=f-c,v=a-c g=f−c,v=a−c,那么可以得到 g i = max ( v i , ( g i − 1 + g i + 1 ) / 2 ) g_i=\max(v_i,(g_{i-1}+g_{i+1})/2) gi=max(vi,(gi−1+gi+1)/2)
由于此时是链而非环,所以是可以得到合法的 c c c
考虑令某些位置作为强制终止状态,也就是只在这些停止,否则继续游走
那么对于 i , i, i,设左右最近的终止为 l , r l,r l,r
那么可以得到 g i = ( r − i ) f l + ( i − l ) f r r − l g_i=\frac{(r-i)f_l+(i-l)f_r}{r-l} gi=r−l(r−i)fl+(i−l)fr,而真正的 g g g还要和 v v v取 max \max max
也就是说将 ( i , v i ) (i,v_i) (i,vi)看做一个点,那么最后就是一个凸包,每个 i i i的 y y y加起来即为答案
所以只需要对 ( i , v i ) (i,v_i) (i,vi)求一个上凸包就好了
注意这里得到的是 g g g,所以还要加上 c c c
code
待填