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. XAMPP简介、安转、使用

    虽然没有写Mac安装方法及使用, 但方法也都大相径庭, 殊途同归而已. XAMPP简介 XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Wi ...

  2. dnspython模块安装

    wget  http://www.dnspython.org/kits/1.12.0/dnspython-1.12.0.tar.gz tar -zxvf dnspython-1.12.0.tar.gz ...

  3. apache服务器主域名跳转www域名

    为集中网站权重,有时候我们需要把www域名跳转到主域名,或者主域名跳转到www域名. apache服务器如何实现主域名跳转www域名: 打开网站根目录下.htaccess文件,没有的话新建一个上传至网 ...

  4. 日程管理 FullCalendar

    日程管理,采用著名组件FullCalendar日历插件实现FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发1.实现按 ...

  5. 关于eclipse的mysql连接配置

    打开eclipse,选择Window→Open Perspective→Other→Database Development,然后在右边的导航栏右键点击Database Connections文件夹, ...

  6. R语言包的安装

    pheatmap包的安装 1: 首先R语言的安装路径里面最好不要有中文路径 2: 在安装其他依存的scales和colorspace包时候要关闭防火墙 错误提示: 试开URL'https://mirr ...

  7. Go语言内存管理(一)内存分配

    Go语言内存管理(一)内存分配 golang作为一种"高级语言",也提供了自己的内存管理机制.这样一方面可以简化编码的流程,降低因内存使用导致出现问题的频率(C语言使用者尤其是初学 ...

  8. CodeForces-747E

    这几天好懒,昨天写的题,今天才来写博客.... 这题你不知道它究竟有多少层,但是知道字符串长度不超过10^6,那么它的总容量是被限定的,用一个二维动态数组就OK了.输入字符串后,可以把它按照逗号分割成 ...

  9. 【BZOJ2959】长跑 (LCT+并查集)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能“为祖国健康工作五十年”,同学们纷纷离开寝室 ...

  10. WEB 小案例 -- 网上书城(二)

    寒假结束了,自己的颓废时间同样结束了,早该继续写博客了,尽管我的格式以及内容由于各种原因老被卡,但必须坚持写下去!!! 上次我们对于本案例的数据库部分进行了阐述,这次主要接着上次的内容分享本案例的翻页 ...