[csp-s模拟测试69] 回滚莫队

A. chess

看到范围一开始猜是矩阵快速幂,开始推按列转移的dp,正方形之间有交集不好转移。

换了个角度,都恰好有c个,那么我在滑动正方形的时候损失几个就要获得几个,然后就看出了列之间的相等关系。

推了个$\Theta(n^4logm)$的dp。码完测了下n=50都T飞,怀疑人生10min,发现k没限制n打成了$\Theta(n^5logm)$

改完发现100依然T飞,然后慌了(因为懊悔T3是原题但我没学回滚莫队...),忘记当时为什么以为log提不出来了orz。

打完dp,观察复杂度瓶颈,首先考虑优化而不是换思路。

预处理快速幂,2s 1e8可过。

 

B. array

看错题了,以为是大水题。

倒序扫描,用单调递减栈维护右端点(如果有i破坏单调性,那么由于i的存在,被pop的元素不可能再成为右端点),考虑如何快速得到最左合法左端点。

维护pos[],mn[],表示单调栈中相邻元素在序列上下标的左闭右开区间中的合法左端点位置及值(即mn<=区间中pos右边的所有数)。

在弹栈的过程中取最小mn[]才能更新答案。分类讨论维护pos[i]和mn[i]。

 

C. ants

一眼permu,上来直接打,算复杂度忘算logn。$\Theta(n\sqrt{n}logn)$

码完测10wT飞,极限6w。发现5e8 3s肝不过,又想起permu非权值线段树打法,wsl。

正解:回滚莫队

发现答案的更新来自与边缘的合并,所以只要维护L[i]表示<=i的最长连续值域长度,R[]同理。

每次更新的时候更新答案、维护边缘的信息。

1             L[a[r]]=L[a[r]-1]+1;
2             R[a[r]]=R[a[r]+1]+1;
3             int tmp=L[a[r]]+R[a[r]]-1;
4             mxr=max(mxr,tmp);
5             L[a[r]+R[a[r]]-1]=tmp;
6             R[a[r]-L[a[r]]+1]=tmp;

以上“加”的操作是$\Theta(1)$的,然而无法随意撤回。

类似Dash Speed,如果我们能保证一个有序的撤回的“深度”合法的处理顺序,那么就可以用栈记录并暴力撤回。

同样的排序(不能奇偶优化)。

对于每个询问,右端点递增,不需要撤回。处理并记录左端点在块内的操作,更新答案然后撤回,块长是$\sqrt{n}$,所以撤销的复杂度为$\Theta(q \sqrt{n})$

 

posted @ 2019-10-12 11:54  hzoi_yzh  阅读(193)  评论(2编辑  收藏  举报