[启发式合并] [模拟] [BZOJ5040] 未来研究

题目传送门
又是水UOJ群看到的题(我怎么这么能水群……),卡了三天终于A了……
这道题是[BZOJ4221]历史研究的加强版,回滚莫队或者分块是过不了的,会T得很惨……
爱JOI人士表示强烈谴责
分析题目发现加入了条件:

询问保证不会存在 Ai<Aj<BiBj 的情况,且对于任意的 i , j 不会有 Bi=Aj,Ai=Aj

也就是说,要不然区间是完全相离的,要不然是完全相交的。
于是利用这个性质,就可以运用启发式合并的思想,将小区间向大区间合并,并同时统计答案,统计答案模拟即可。(不过线段树合并貌似会T)
这说起来太简单了吧?
心(m)路(m)历(p)程(time):
9.30:知道了这道题,然后:
Text1
蛤?俩For就A了?
写写写……
然后还XJB分析了一波(真丢人我退群吧……)
10.1:写写写,TTT……干这不是暴力吧!
这里写图片描述
又试了几个莫队和分块,全T了……
10.2:没写,想了想发现如果把一些小区间的信息留下,合成大区间的代价就会小很多,然后就在想怎么把小区间的信息留下,然后就想到了双指针扫描???……(歪了)
然后从ccz处得知是dsu on tree?
然后知道了是从小区间转移(这回对了……)
又问了Claris巨巨他还是说暴力QAQ……
10.3:晚上开写,发现自己的合并还是T……
问了ccz,发现自己思路没什么问题,就是询问区间处理不太好,排序混乱,写到了 O(n2) 的复杂度,然后调到了大半夜……(因为硬要排成一种诡异的顺序)
10.4:脑洞大开想到把询问做成树,然后TreeDSU(树上启发式合并)……
然后就是排区间的问题了……
不过怎么写都是 O(n2) 的还是过不去(干)……
然后……发现自己智障了!题中区间的性质还有很多啊,比如如果两个区间 a,b a.l<b.l ,如果 a.rb.r ,那么 a 区间一定要比 b 区间大啊……于是按排线段的顺序排序,记录一下已经枚举到的位置就可以做了啊!
原来因为要把区间长度也考虑进去于是T掉了……
这样不就 O(n) 了吗!
(捂脸)
好了可以TreeDSU了……(???)
于是建了一棵树,开始XJB合并(TreeDSU是点分治的改版?发现TreeDSU找的是重儿子而点分治找的是重心),合并还用了个map……
还从BZOJ要到了数据……于是不停地T……
没招了,和ccz的code对拍……
一组就挂了……
发现map效率不高,而且TreeDSU合并成的答案还不对……
原因是合并两个区间未必能合成一个大的询问区间,有可能还需要未询问到的区间信息……
(这时候脑子已经锈掉了……)
于是开始写正解……区间排序什么的都还可以,统计答案这个……
我们需要一直把轻儿子合并到重儿子或者根上,所以需要一个递归……
然后,递归到的最小一层一定在大区间内部,然后向外扩展即可……这个向外扩展类似莫队的调整区间的方式。
因为这个轻儿子的规模我猜 O(log2n) 的,所以总复杂度是 O(nlog2n) 的……
不过又T了……TAT……
发现那个递归可以写成非递归的形式……(干)
改完之后快了1倍啊啊啊啊啊……
总结一下吧:
启发式合并
排区间的方式……
能用非递归不要用递归……
少在脑子锈掉的时候写题
总时间复杂度是 O(Tlog2(nT)) ?xbb别当真……
Code

猜你喜欢

转载自blog.csdn.net/HeRaNO/article/details/78158929