学了一下吉老师的在某年WC的讲的线段树。
特来总结,学习一番.
PDF地址:吉老师的Segment tree Beats!
楔子:给出一个数列A 每次让某个区间中的\(a_i\)对x取min 询问某个区间的和。
\(n,m\leq 500000\)
由于存在多次询问 我们进行标记永久化也没什么用 如果是一次的话我可以每次把标记标记到区间 最后求值即可。
这里要引出吉司机线段树了。
做法:线段树维护区间最大值mx 最大值次数 T 次大值 se 维护区间和 sum
当某个区间要对x取min时 显然 mx<=x直接跳过这个区间 se
最坏的情况 x
通过吉老师的证明 这复杂度最坏是mlog^2的!
具体证明:自己看pdf... 好吧听说吉老师证明是萎的 具体证明看国家集训队论文 时间复杂度 每次修改时间复杂度为log^2
说了这么多了 上例题/cy
bzoj 4695最假女选手
虽然很复杂 但是 还是要码的 要迎男而上 男上加男?
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
一遍AC 再见 这又臭又长的代码 把我给写蒙蔽了 没想到这么长 尽管我已经极力压行了。。
考虑标记问题 我们在下放标记是 有两类标记 可以发现 赋值标记可以被区间加标记给修改 区间加标记则不能被赋值标记修改。
所以我们在进行区间修改时 我们把赋值标记修改后就相当于赋值标记后来 区间加标记先来这个顺序。
所以再pushdown的时候也同样 先区间赋值 再单点赋值。
需要注意的是 修改mx时会影响到mn sn,修改mn时可能会影响到mx sx.