CDQ分治

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外面再套一层分治,把多出的一维干掉(模板

posted @ 2024-12-10 21:15  煦阳gyy  阅读(56)  评论(0)    收藏  举报