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. 用UltraISO制作CentOS U盘安装盘

    1    下载UltraISO 网上有很多版本,下个绿色版的就ok了. 下载地址:http://www.pc6.com//softview/SoftView_13698.html 2    下载Cen ...

  2. JPA数据懒加载LAZY和实时加载EAGER(二)

    懒加载LAZY和实时加载EAGER的概念,在各种开发语言中都有广泛应用.其目的是实现关联数据的选择性加载,懒加载是在属性被引用时,才生成查询语句,抽取相关联数据.而实时加载则是执行完主查询后,不管是否 ...

  3. Dubbo广播模式下报错:Can't assign requested address解决办法

    原因: 尝试使用Dubbo的multicast模式,发现一运行就报Can't assign requested address的错误,造成这种原因的主要是系统中开启了IPV6协议(比如window7) ...

  4. C语言_简单了解一下typedef

    作为一名PHPer,了解一下C还是有必要的,只是做一个简单的了解,因为并没有做开发C的想法. 关于typedef的详细说明,网上搜过了很多帖子,这篇算是最详细的了:http://blog.csdn.n ...

  5. sonar + jacoco + mockMvc 模拟session 用户登录 配合SpringSecurity 权限 快速测试代码覆盖率.

    遇到mock 测试简直就是神器,特别是要做代码覆盖率,直接测试controller就好了,缺点,虽然可以回滚事务,但是依赖数据库数据,解决,根据SpringBoot ,再建立一个专门跑单元测试的数据库 ...

  6. Git 版本退回commit

    有的时候错误提交了commit,需要版本退回. 先用git log查看一下节点版本号commit_id $ git log 再用git reset退回 $ git reset -soft commit ...

  7. 我的Java设计模式-观察者模式

    相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...

  8. iOS学习 NSString常用技巧

    字符串是程序设计最常用的数据类型之一了.在Mac/iPhone编程中,苹果为我们提供了一个不同的字符串类型NSString.有别与普通的String为数据类型,NSString其实是一个对象类型.NS ...

  9. Android WebView 缓存机制和模式详解

    当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹: 我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webv ...

  10. APACHE服务器出现No input file specified.的完美解决方案

    启用REWRITE的伪静态功能的时候,首页可以访问,而访问内页的时候,就提示:“No input file specified.” 原因在于使用的PHP是fast_cgi模式,而在某些情况下,不能正确 ...