开始想用分治,找到中间的一个小于的客栈,然后用到它的两边的客栈的贡献就可以用前缀和轻易算出。然后递归处理左右。 后来发现没有这个必要,从左向右扫一遍就好了。 每次找到当前第一个小于的客栈,这样它前面的客栈与他自己的贡献便可以处理。 预处理,主过程. #include<iostream> #include<cstdio> #define maxn 200010 using namespace std; int f[maxn][60],v[maxn],col[maxn]; int main(){ int n,k,p;scanf("%d%d%d",&n,&k,...