B.Construct Sequences
观察数据范围:ai,bi≤109,n≤2×104a_i,b_i\leq 10^9,n\leq 2\times 10^4ai,bi≤109,n≤2×104
n2<109n^2<10^9n2<109,所以让构造的a,ba,ba,b公差为nnn即可。
pip_ipi就在aia_iai处+(i−1)+(i-1)+(i−1)即可。
C.Pushing Balls
辣鸡推式子题!(dp想半天无解)
模拟一轮的操作,发现剩下n−1n-1n−1个球与坑的距离还是个等差数列(具体过程略):
每轮移动期望距离d+2n−12xd+\dfrac{2n-1}{2x}d+2x2n−1,一轮完毕后d′=d+2d+5x2n,x′=x+4x2nd'=d+\dfrac{2d+5x}{2n},x'=x+\dfrac{4x}{2n}d′=d+2n2d+5x,x′=x+2n4x
所以这道题教会我们:推不出dp就先模拟一轮,说不定变化有规律?
D.Shik and Game
显然最优操作是每次给一段连续区间的熊喂糖,然后回到区间第一只熊的位置依次取硬币,设fif_ifi表示最后一个区间以iii结尾的最优值,转移如下:
fi=min(fj+max(T,2(xi−xj+1)))f_i=min(f_j+\max(T,2(x_i-x_{j+1})))fi=min(fj+max(T,2(xi−xj+1)))
答案即fn+Ef_n+Efn+E
可以单调指针扫到最后一个jjj满足2(xi−xj+1)≥T2(x_i-x_{j+1})\geq T2(xi−xj+1)≥T,记录前缀和min(fj−2xj+1)\min(f_j-2x_{j+1})min(fj−2xj+1)。对于2(xi−xj+1)<T2(x_i-x_{j+1})< T2(xi−xj+1)<T的部分,由于fif_ifi单调不降,所以用fj+1+Tf_{j+1}+Tfj+1+T更新fif_ifi即可。
E.Shik and Travel
再一次zz地忽略了题目中的关键性质:满二叉树…
二分答案midmidmid:
因为每条边只能走两次,所以要先选完子树内的叶子结点才能走别的。考虑dfsdfsdfs遍历这颗树,假设当前处理到xxx点,它到左右儿子的距离分别为v0,v1v_0,v_1v0,v1。
每个结点维护一个数对(a,b)(a,b)(a,b)集合SxS_xSx,其中a,ba,ba,b分别表示根到第一个叶结点的距离和最后一个叶结点到根的距离。
对于点xxx,若左儿子集合SlS_lSl中的(a,b)(a,b)(a,b)和右儿子集合SrS_rSr中的(a′,b′)(a',b')(a′,b′)满足b+a′+v0+v1≤midb+a'+v_0+v_1\leq midb+a′+v0+v1≤mid,则点xxx的集合中存在(a+v0,b′+v1)(a+v_0,b'+v_1)(a+v0,b′+v1)。
强制∣Sl∣≤∣Sr∣|S_l|\leq |S_r|∣Sl∣≤∣Sr∣(不满足的swap(l,r)swap(l,r)swap(l,r)即可),对于∣Sl∣|S_l|∣Sl∣中的每个数对(a,b)(a,b)(a,b):
在SrS_rSr中找到满足b+a′+v0+v1≤midb+a'+v_0+v_1\leq midb+a′+v0+v1≤mid且b′b'b′最小的数对(a′,b′)(a',b')(a′,b′),将(a+v0,b′+v1)(a+v_0,b'+v_1)(a+v0,b′+v1)压入SxS_xSx;
在SrS_rSr中找到满足b′+a+v0+v1≤midb'+a+v_0+v_1\leq midb′+a+v0+v1≤mid且a′a'a′最小的数对(a′,b′)(a',b')(a′,b′),将(a′+v1,b+v0)(a'+v_1,b+v_0)(a′+v1,b+v0)压入SxS_xSx。
若∣Sroot∣>0|S_{root}|>0∣Sroot∣>0,则有解。
∣Sx∣≤2∣Sl∣|S_x|\leq 2|S_l|∣Sx∣≤2∣Sl∣,类似于启发式合并,时间复杂度O(nlog2n)O(n\log ^2n)O(nlog2n)
F.Shik and Copying String
将TTT分成若干个内部字符相同的段。对于每段[l,r][l,r][l,r]的开头lll,找到最大的iii满足i≤li\leq li≤l且S0[i]=T[l]S_0[i]=T[l]S0[i]=T[l],那么这一段必然由S0[i]S_0[i]S0[i]转移而来。
贪心地看,我们应该倒序逐次地转移得到TTT的每个段:
红色表示最终转移到的区间,从上到下依次是S0,S1,S2,S3S_0,S_1,S_2,S_3S0,S1,S2,S3。
特判掉S0=TS_0=TS0=T和Sl=SiS_l=S_iSl=Si的情况(答案分别为0,1),那么其它情况都存在折线重叠。
考虑双端队列qqq维护重叠折线,答案即过程中双端队列大小最大值+1(加上折线到lll后拓展到rrr的一步):
考虑加入当前的点iii,q[head]q[head]q[head]怎样才会限制到iii呢?
假设当前加入333号点,双端队列中元素为1,21,21,2,可以发现在111的限制下,333在第二次转移后最多只能拓展到q[head]−(head−tail)q[head]-(head-tail)q[head]−(head−tail)的位置——若l3l_3l3在这个位置之前,那么q[head]q[head]q[head]就限制不到333了。
不断弹出队首直至满足q[head]−(head−tail)≤l3q[head]-(head-tail)\leq l_3q[head]−(head−tail)≤l3或者队列为空,然后将333加入队尾。并在过程中不断用head−tail+1head-tail+1head−tail+1更新ansansans。
答案即ans+1ans+1ans+1。