tg 80 solution
T1
卡掉愚蠢的\(O(n\log n)\)做法!
首先玩一个小数据
它长这样:
6 3
abcdef
2 4 6
答案长这样:
febacd
观察一下它的规律:
假设有一个双端队列,一开始是空的
然后把元素依次插入这个队列,
当第\(i\)次操作的时候,
如果\(2\not |i,\)对于\([pos_{i-1}+1,pos_{i}]\)的部分是从头插入
否则是从尾插入
但是用下发样例的话会发现这个是假的
区别在于是否有\(2|k\)
当\(2\not|k\)的时候上面的那个是对的,
否则就是反过来
当第\(i\)次操作的时候,
如果\(2\not |i,\)对于\([pos_{i-1}+1,pos_{i}]\)的部分是从尾插入
否则是从头插入
T2
打表好题,可以回去折腾一顿whk
同学
首先打一个\(n=1e5\)的表
然后会发现第一个生成规律:
\(y=x^3\)
证明比较简单,直接往回代\(y\)分解质因数就好了
然后会发现有些数对不满足这个规律,
比方说\((8,30)\)
然后多打几个就会发现:
如果有\((x,y),y=x^3\)
那么计此时\(x\)为一条新的链的起点\(b\)
然后对于一个新的\(y\)的生成规律,有
\(y'=b^2\cdot y-x,(y,y')\)就是一对合法的数对
发现在\(n=1e18\)这个范围以内,每个\(y\)仅会在一个数对里出现
于是考虑把所有的\(y\)存下来,总共\(10^6\)个这样的\(y\)
(因为这玩意\(y=O(x^3),\)所以至多会有\(\sqrt[3]{n}\)个这样的对)
然后每次二分下标找就行了
T3
不知道为什么题解写的最详细的东西是最好理解的东西
更不知道题解为什么把最难理解的东西就用4个字概括......
首先那个最好理解的东西,就是
如果你让\(a_j\)覆盖\(i,\)那么\(a_j=\min\{a_k\},k\in[i,j]\)
只有所有的操作都满足这个的时候,操作合法
然后你套路性先做个单调栈找出每个点能覆盖的区间
然后考虑\(DP\)
记\(f_i\)表示区间已经覆盖完\([1,i]\)的方案数
然后枚举每一个区间,会有这个转移方程:
\(f_i\leftarrow f_{j-1}+f_{i},\)
然后发现这个东西是可以前缀和优化的
于是我们时间复杂度就\(O(n^2)\)了
不用区间\(DP\)的原因是:
虽然区间\(DP\)感觉很自然,但是时间复杂度下不去
还是要抛弃维护冗余状态的心理
然后上面的东西没有要求左右端点分别位于原位置两侧,是因为这样会算漏
T4
会个非常垃圾的状压,好像还是错的......