您的位置:首页 > 其它

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

2017-10-04 18:40 197 查看
题目传送门

又是水UOJ群看到的题(我怎么这么能水群……),卡了三天终于A了……

这道题是[BZOJ4221]历史研究的加强版,回滚莫队或者分块是过不了的,会T得很惨……

爱JOI人士表示强烈谴责

分析题目发现加入了条件:

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

也就是说,要不然区间是完全相离的,要不然是完全相交的。

于是利用这个性质,就可以运用启发式合并的思想,将小区间向大区间合并,并同时统计答案,统计答案模拟即可。(不过线段树合并貌似会T)

这说起来太简单了吧?

心(m)路(m)历(p)程(time):

9.30:知道了这道题,然后:



蛤?俩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.r≤b.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: