「考试」省选70

好像又是宿命的毒瘤出题人王队长的题(WC被他的题灭了)给跪了。

T1
我们可以做一个分裂的操作。
每次找到当前区间右端点所连边的最小值,那么这个肯定是对应了某一个位置\(x\)
同时又有\(x\equiv r\ (mod\ mid)\),所以\(mid-1\equiv r-x-1\ (mod\ mid)\)
那么我们就找到了左侧小区间的右端点了。
这样一层一层的分治下去,并实时判断是否合法就行了。
注意判断的时候把当前这一层所对应的连边删掉即可。

T2
这个题的话是个博弈+\(dp\).
我们发现第一个人可以在控制在地图上横向走,第二个人限制第一个人在什么位置上下走
第一个人希望权值最小,第二个人希望最大。
那么我们设\(L[i][l][r],R[i][l][r]\)分别表示在第\(i\)行,还要走过的区间是\([l,r]\)的情况下在\(l-1/r+1\)位置的最小权值。
那么根据是上下转移还是左右转移分别取\(min\)\(max\)就可以了。
注意边界问题。
注意这个形式定义的\(dp\)是倒推。

T3
这个题数据结构。
题解说是\(O(nlog^2n)\).
事实上可以做到\(O(nlogn)\).
要求维护\(n\)个可重集合,并且支持五种操作。
1.集合添加元素。
2.集合删除元素。
3.合并集合。
4.求一个集合的\(mex\)和神秘数。
5.进行历史版本操作4。
前三个可以直接用权值线段树+线段树合并。
先不考虑第五个操作。
第四个操作的话,权值线段树支持树上二分求出\(mex\)
考虑神秘数如何求。
我们发现如果我们把所有的元素按照顺序排好。
开始的时候神秘数是1,碰到一个元素,如果这个元素小于等于神秘数,那么神秘数等于当前所有加入的数的和+1.
否则神秘数不做出改变。
这个操作在线段树上同样可以维护。
我们对每一个区间维护一个\(d[x]\)表示如果当前神秘数的大小大于等于\(d[x]\),可以把当前区间给累加进神秘数。
那么有\(d[x]=max(d[lc[x]],d[rc[x]]-sum[lc[x]])\)意思是后面这个区间的那部分要在先把前面那段区间给收复的情况下至少需要的神秘数大小。
这样我们仍然做一个树上二分就可以求出神秘数了。
关于操作5.
我们用\(set\)维护历史版本线段树的根。
同时做可持久化线段树加入删除和合并就可以了。
时空复杂度都是\(O(nlogn)\)的。

posted @ 2020-04-14 17:32  Lrefrain  阅读(125)  评论(0编辑  收藏  举报