「IOI2020」植物比较

题意

洛谷

"满足\(2k>n\)"

我们可以证明合法的排列只有一种:

结论1.1\(r_i=0\)的位置,处于不超过\(\left\lceil\frac{n}{2}\right\rceil\)长度的一段

从大到小(\(n\rightarrow 1\))填入数字
\(n\)填入最左边那个\(0\)的位置,然后将前面一段长度为\(k-1\)的区间的\(\{r_i\}\)\(1\)
此时\(r_i=0\)的位置依然满足结论1,反复重复此操作即可得到合法排列

\(2k>n\)为大体上的填数方法指明了方向

"任意情况"

定义:令集合\(P\)为合法的排列的集合

结论2.1:按如下方式构造,一定可以构造出一个合法的排列:
找到任意满足"\(r_i=0\)且满足\(\forall j\in(i-k,i),r_j\neq 0\)",将当前未填的最大数填入

证明:
假设当前有解,在某合法位置填完\(x\)(当前未填的最大数)后无解了
容易证明在原解\(x\)的位置与当前合法位置交换后,一定合法,与假设矛盾

推论:容易发现合法的排列仅能通过上述方法构造

结论2.2\(\forall p,q\in P\)\(p,q\)任意长度为\(k\)的区间数相对大小关系相同

证明:
在按上述方法构造过程中,容易发现\(\forall i,j,|i-j|<k\),较大者应早于较小者填

于是正解呼之欲出了:
找到任意一个合法的排列
按大小关系连边,对于查询,就是看是否存在\(x\)\(y\)的路径

对于合法的排列,可以用线段树与栈加速
但边数是\(O(n^2)\)
对于\(\forall i\),在\((i-K,i),(i,i+K)\)两个区间找到值最小的且大于\(i\)的位置,分别连边,边数\(O(n)\)
在查询时,先从\(x\)跳到\(y\)附近,再判断大小关系,可以用倍增加速

总复杂度\(O(nlogn)\)

提醒:如果RE或WA了把空间开大点

posted @ 2020-12-08 11:19  Grice  阅读(148)  评论(0编辑  收藏  举报