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

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

询问保证不会存在 A i < A j < B i ≤ B j A_i<A_j<B_i\le B_j Ai<Aj<BiBj的情况,且对于任意的 i i i, j j j不会有 B i = A j , A i = A j B_i=A_j,A_i=A_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 ( n 2 ) O(n^2) O(n2)的复杂度,然后调到了大半夜……(因为硬要排成一种诡异的顺序)
10.4:脑洞大开想到把询问做成树,然后TreeDSU(树上启发式合并)……
然后就是排区间的问题了……
不过怎么写都是 O ( n 2 ) O(n^2) O(n2)的还是过不去(干)……
然后……发现自己智障了!题中区间的性质还有很多啊,比如如果两个区间 a , b a,b a,b a . l < b . l a.l<b.l a.l<b.l,如果 a . r ≤ b . r a.r\le b.r a.rb.r,那么 a a a区间一定要比 b b b区间大啊……于是按排线段的顺序排序,记录一下已经枚举到的位置就可以做了啊!
原来因为要把区间长度也考虑进去于是T掉了……
这样不就 O ( n ) O(n) O(n)了吗!
(捂脸)
好了可以TreeDSU了……(???)
于是建了一棵树,开始XJB合并(TreeDSU是点分治的改版?发现TreeDSU找的是重儿子而点分治找的是重心),合并还用了个map……
还从BZOJ要到了数据……于是不停地T……
没招了,和ccz的code对拍……
一组就挂了……
发现map效率不高,而且TreeDSU合并成的答案还不对……
原因是合并两个区间未必能合成一个大的询问区间,有可能还需要未询问到的区间信息……
(这时候脑子已经锈掉了……)
于是开始写正解……区间排序什么的都还可以,统计答案这个……
我们需要一直把轻儿子合并到重儿子或者根上,所以需要一个递归……
然后,递归到的最小一层一定在大区间内部,然后向外扩展即可……这个向外扩展类似莫队的调整区间的方式。
因为这个轻儿子的规模我猜 O ( log ⁡ 2 n ) O(\log_2 n) O(log2n)的,所以总复杂度是 O ( n log ⁡ 2 n ) O(n\log_2 n) O(nlog2n)的……
不过又T了……TAT……
发现那个递归可以写成非递归的形式……(干)
改完之后快了1倍啊啊啊啊啊……
总结一下吧:
启发式合并
排区间的方式……
能用非递归不要用递归……
少在脑子锈掉的时候写题
总时间复杂度是 O ( T log ⁡ 2 ( n T ) ) O(T\log_2 (nT)) O(Tlog2(nT))?xbb别当真……
Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值