6279. 2019.8.5【NOIP提高组A】优美序列

结论1:若两个优美区间相交不包含,则二者重合部分也是优美区间
证明1:设两个区间为A和B,则A-(A∩B)的部分一定是A在数域上的前缀/后缀(否则会有空,数字不重复,加上B-(A∩B)后不能填补空缺,不是优美区间),所以A-(A-(A∩B))=A∩B是优美序列

做法:
枚举优美区间的右边界R,设其向左的极长区间为C,则有结论2

结论2:所有在C内的 未处理的 询问区间 的答案 的右边界为R(每找到一个R就把未处理的包含的询问区间全部处理,或者说是每个询问区间在向右的最小的包含其的R上处理)
证明2:若右边界不为R,则R向右有一个更短的区间D包含询问区间,那么C∩D一定是合法且更优的答案(画图理解),而且C∩D以R为右边界,也会在处理R的时候处理到,故右边界为R

做法(续):
按顺序扫R,用堆维护当前未处理的询问,每次先加询问,之后按顺序找符合的询问并求解
判断优美区间可以用线段树维护左边界,原理是把连续的一段数的相邻数字相连,则数字个数-相邻个数=1,线段树每次把1~R加1,再把相邻数x和x+1的位置1~min(id[x],id[x+1])减1,维护线段树最小值及其位置的min/max
处理询问[l,r]时先判断l<=(1~R的最小值位置的max),即是否被最长优美区间包含,再求答案,为1~l最小值位置的max,即为找最短的优美区间

时间复杂度O((n+m)log)

posted @ 2022-07-17 11:38  gmh77  阅读(87)  评论(0)    收藏  举报