S与S的无赖同盟(KTT)
Judgelight · · 个人记录
一开始还想着“这个文笔,牛逼啊,现在都这么有技术力了吗”,结果一看后记野村美月!对不起长官,刚才没有认出你。
言归正传,虽然我既不是 s 也不是 m 但是这本书确实很有趣,而且恋爱喜剧的成分很重,野村美月老师特有的细腻文笔也表现得淋漓尽致,可以供消遣用。感觉她做得最成功的一点是避免了人物脸谱化,每个人仿佛都没有很浓厚的戏剧效果,说是恋爱喜剧不如说是小故事。
模板
经典问题:单点加区间最大子段和
加强:区间加区间最大子段和(加的都是正数)
原问题的信息维护:
我们考虑区间加对这些操作的影响,如果区间加之后最优的决策点没有发生变化,那么每个值应该可以写成一次函数的形式:
为了判断最优决策区间是否发生改变,我们还需要记录一个值
关于标记的合并:
-
s=l.s+r.s -
ls=\max(l.ls,l.s+r.ls) -
rs=\max(r.rs,r.s+r.rs) -
mx=\max(l.mx,r.mx,l.rs+r.ls) -
其中
时间复杂度:
struct Line{int k;ll b;};
inline Line operator+(const Line &a,const Line &b){return (Line){a.k+b.k,a.b+b.b};}
pair<Line,ll>max(Line a,Line b){
if(a.k<b.k||(a.k==b.k&&a.b<b.b))swap(a,b);
if(a.b>=b.b)return mk(a,inf);
return mk(b,(b.b-a.b)/(a.k-b.k));
}
struct Misaka{Line s,ls,rs,mx;ll x;};
inline Misaka operator+(const Misaka &a,const Misaka &b){
Misaka c;pair<Line,ll>o;
c.s=a.s+b.s,c.x=min(a.x,b.x);
o=max(a.ls,a.s+b.ls),c.ls=o.first,c.x=min(c.x,o.second);
o=max(b.rs,b.s+a.rs),c.rs=o.first,c.x=min(c.x,o.second);
o=max(a.mx,b.mx),c.x=min(c.x,o.second);
o=max(o.first,a.rs+b.ls),c.mx=o.first,c.x=min(c.x,o.second);
return c;
}