CDQ分治2

CDQ套CDQ:四维偏序问题

题目来源:COGS 2479 偏序

#define LEFT 0
#define RIGHT 1 struct Node{int a,b,c,d,bg;};
Node q[_],tmp1[_],tmp2[_]; int aa,bb,cc,dd,n; long long Ans; void cdq2(RG int L,RG int R){
if(L == R)return;
RG int mid = (L+R)>>1; cdq2(L,mid); cdq2(mid+1,R);
RG int oo = L , l = L , r = mid + 1;
while(l <= mid && r <= R){
if(tmp1[l].c < tmp1[r].c){
if(tmp1[l].bg == LEFT)BIT:: Update(tmp1[l].d);
tmp2[oo++] = tmp1[l++];
}
else {
if(tmp1[r].bg == RIGHT)Ans += BIT::Query(tmp1[r].d);
tmp2[oo++] = tmp1[r++];
}
}
while(l <= mid)tmp2[oo++] = tmp1[l++];
while(r <= R){
if(tmp1[r].bg == RIGHT)Ans += BIT::Query(tmp1[r].d) ;
tmp2[oo++] = tmp1[r++];
}
for(RG int i = L; i <= R; i ++){
if(tmp2[i].bg == LEFT)BIT::Clear(tmp2[i].d);
tmp1[i] = tmp2[i];
}
return;
} void cdq1(int L,int R){
if(L == R)return;
RG int mid = (L+R)>>1; cdq1(L,mid); cdq1(mid+1,R);
RG int oo = L , l = L ,r = mid + 1;
while(l <= mid && r <= R){
if(q[l].b < q[r].b)
q[l].bg = LEFT ,
tmp1[oo++] = q[l++] ;
else
q[r].bg = RIGHT ,
tmp1[oo++] = q[r++] ;
}
while(l <= mid)q[l].bg = LEFT , tmp1[oo++] = q[l++];
while(r <= R)q[r].bg = RIGHT , tmp1[oo++] = q[r++];
for(RG int i = L; i <= R; i ++)q[i] = tmp1[i];
cdq2(L,R);
} int main(){
freopen("partial_order.in","r",stdin);
freopen("partial_order.out","w",stdout);
n = gi();
for(RG int i = 1; i <= n; i ++)q[i].a = i;
for(RG int i = 1; i <= n; i ++)q[i].b = gi();
for(RG int i = 1; i <= n; i ++)q[i].c = gi();
for(RG int i = 1; i <= n; i ++)q[i].d = gi();
Ans = 0; cdq1(1,n);
cout<<Ans; return 0;
}

CDQ套CDQ套CDQ:五维偏序问题

题目来源:COGS 2580 偏序 \(II\)

#define LEFT 0
#define RIGHT 1 struct Node{int d1,d2,d3,d4,d5,bg[2];};
Node q[_] , tmp1[_] , tmp2[_] , tmp3[_]; int n; long long ans; IL bool Check(RG int id,RG int opt)
{return tmp2[id].bg[0]==opt && tmp2[id].bg[1]==opt;} void cdq3(RG int L,RG int R){ //cdq分治解决三维偏序问题
if(L == R)return;
RG int mid = (L+R)>>1; cdq3(L,mid); cdq3(mid+1,R);
RG int l = L , r = mid+1 , oo = L-1;
while(l <= mid && r <= R){
if(tmp2[l].d4 < tmp2[r].d4){
if(Check(l,LEFT))BIT::Update(tmp2[l].d5);
tmp3[++oo] = tmp2[l++];
}
else{
if(Check(r,RIGHT))ans += BIT::Query(tmp2[r].d5);
tmp3[++oo] = tmp2[r++];
}
}
while(l <= mid)tmp3[++oo] = tmp2[l++];
while(r <= R){
if(Check(r,RIGHT))ans += BIT::Query(tmp2[r].d5);
tmp3[++oo] = tmp2[r++];
}
for(RG int i = L; i <= R; i ++){
if(Check(i,LEFT))BIT::Clear(tmp2[i].d5);
tmp2[i] = tmp3[i];
}
return; } void cdq2(RG int L,RG int R){ //消去第三维的影响
if(L == R)return;
RG int mid = (L+R)>>1; cdq2(L,mid); cdq2(mid+1,R);
RG int l = L , r = mid+1 , oo = L-1;
while(l <= mid && r <= R){
if(tmp1[l].d3 < tmp1[r].d3)
tmp1[l].bg[1] = LEFT , tmp2[++oo] = tmp1[l++];
else
tmp1[r].bg[1] = RIGHT , tmp2[++oo] = tmp1[r++];
}
while(l <= mid)tmp1[l].bg[1] = LEFT , tmp2[++oo] = tmp1[l++];
while(r <= R)tmp1[r].bg[1] = RIGHT , tmp2[++oo] = tmp1[r++];
for(RG int i = L; i <= R; i ++)tmp1[i] = tmp2[i];
cdq3(L,R); } void cdq1(RG int L,RG int R){ //消去第二维的影响
if(L == R)return;
RG int mid = (L+R)>>1; cdq1(L,mid); cdq1(mid+1,R);
RG int l = L , r = mid+1 , oo = L-1;
while(l <= mid && r <= R){
if(q[l].d2 < q[r].d2)
q[l].bg[0] = LEFT , tmp1[++oo] = q[l++];
else
q[r].bg[0] = RIGHT , tmp1[++oo] = q[r++];
}
while(l<=mid)q[l].bg[0] = LEFT , tmp1[++oo] = q[l++];
while(r<=R)q[r].bg[0] = RIGHT , tmp1[++oo] = q[r++];
for(RG int i = L; i <= R; i ++)q[i] = tmp1[i];
cdq2(L,R);
} int main(){
freopen("partial_order_two.in","r",stdin);
freopen("partial_order_two.out","w",stdout);
n = gi();
for(RG int i = 1; i <= n; i ++)q[i].d1 = i;
for(RG int i = 1; i <= n; i ++)q[i].d2 = gi();
for(RG int i = 1; i <= n; i ++)q[i].d3 = gi();
for(RG int i = 1; i <= n; i ++)q[i].d4 = gi();
for(RG int i = 1; i <= n; i ++)q[i].d5 = gi();
//sort_a 消去第一维的影响
ans = 0; cdq1(1,n);
cout << ans; return 0;
}

CDQ分治嵌套模板:多维偏序问题的更多相关文章

  1. CDQ分治求不知道多少维偏序 (持续更新 ]

    求三维偏序的模板 : //Author : 15owzLy1 //luogu3810.cpp //2018 12 25 16:31:58 #include <cstdio> #includ ...

  2. CDQ分治学习笔记(三维偏序题解)

    首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ ...

  3. CDQ 分治算法模板

    CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...

  4. [学习笔记] CDQ分治&整体二分

    突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...

  5. 『cdq分治和多维偏序问题』

    更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...

  6. P3810 【模板】三维偏序(陌上花开)(CDQ分治)

    题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ici​ 三个属性,设 f(i) ...

  7. P3810 【模板】三维偏序(陌上花开)cdq分治

    传送门:https://www.luogu.org/problemnew/show/P3810 cdq分治的模板题,第一层外部排序,第二层cdq归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...

  8. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  9. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

随机推荐

  1. Dagger2 使用全解析

    Dagger2 使用全解析 Dagger是一个注入工具,何为注入,我们要生产一批机器人,每个机器人都有一个控制器,我们可以在机器人内部 new 出一个控制器: class Robot { val co ...

  2. Windows使用问题总结

    1 电脑休眠恢复之后无法识别Wifi无线网络 首先,重启电脑:其次,打开网络和共享中心,点击更改适配器设置:最后,在对应的无线网络连接图标上点击鼠标右键,属性,配置,电源选项,允许计算机关闭此设备以节 ...

  3. 搭建dnsmasq服务器,局域网内部解析

    系统:centos6.5 公司内部需求一台dns server,解析内部域名(该域名不需要在公网上解析) 安装了"bind bind-utils"包,配置里设置转发到外部电信dns ...

  4. 《InsideUE4》UObject(六)类型系统代码生成重构-UE4CodeGen_Private

    读的不如写的快 引言 在之前的<InsideUE4>UObject(四)类型系统代码生成和<InsideUE4>UObject(五)类型系统收集章节里,我们介绍了UE4是如何根 ...

  5. 通过实例介绍Android App自动化测试框架--Unittest

    1.为什么需要使用框架实现自动化测试 作为测试工程师,可能在代码能力上相比开发工程师要弱一点,所以我们在写脚本的时候就会相对容易的碰到更多的问题,如果有一个成熟的框架供给我们使用的话,可以帮助我们避免 ...

  6. crontab定时任务(centos)

    cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond stop /sbi ...

  7. 理解Activity.runOnUiThread()

    这是一篇译文(中英对照),原文链接:Understanding Activity.runOnUiThread() When developing Android applications we alw ...

  8. Java.lang.Comparable接口和Java.util.Comparator接口的区别

    Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...

  9. UVA - 10048 Audiophobia Floyd

    思路:套用Floyd算法思想,d(i, j) = min(d(i,j), max(d(i,k), d(k,j)),就能很方便求得任意两点之间的最小噪音路径. AC代码 #include <cst ...

  10. STL中坑爹的max函数

    hdu1754永远难忘的痛,参数最好不要传耗时特别长的函数,因为会调用两次,如果是递归的话,不知道多少次呢.. 切记!切记!切记! 例如: //return max(getAns(root<&l ...