CDQ分治,解决三维数点(三维偏序)问题。
第一维用分治化掉,用第一维<=mid的向第一维>mid的贡献,剩下的两维用二维数点解决。模板
在线二维数点转化为离线三位数点
其实任何在线k维数点都可以转化为离线(k+1)维数点,常见是把时间变成一维,每次数时间这一维比自己小且满足另两位限制的点(例1,例2)
CDQ优化DP
CDQ优化DP,就是当DP方程式要满足一个三位偏序关系才能转移时,可用CDQ处理。每次树状数组修改时修改值维当前对应dp值。要注意必须左右CDQ中间夹着处理,像这样:
点击查看代码
CDQ1(l,mid,lo);
for(auto i:vp){
if(h[i]<=mid)modify(v[i],f1[i]);
else {
f1[i]=Max(f1[i],query(v[i])+1);
f1[i].cnt=max(f1[i].cnt,1.0);
}
}
for(auto i:vp)if(h[i]<=mid)clear_(v[i]);
CDQ1(mid+1,r,ro);
点击查看代码
CDQ1(l,mid,lo);CDQ1(mid+1,r,ro);
for(auto i:vp){
if(h[i]<=mid)modify(v[i],f1[i]);
else {
f1[i]=Max(f1[i],query(v[i])+1);
f1[i].cnt=max(f1[i].cnt,1.0);
}
}
for(auto i:vp)if(h[i]<=mid)clear_(v[i]);
四位偏序
其实就是在CDQ外面再套一层分治,把多出的一维干掉(模板)