CDQ分治嵌套模板:多维偏序问题
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分治嵌套模板:多维偏序问题的更多相关文章
- CDQ分治求不知道多少维偏序 (持续更新 ]
求三维偏序的模板 : //Author : 15owzLy1 //luogu3810.cpp //2018 12 25 16:31:58 #include <cstdio> #includ ...
- CDQ分治学习笔记(三维偏序题解)
首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai.b_ibi.c_ ...
- CDQ 分治算法模板
CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...
- [学习笔记] CDQ分治&整体二分
突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...
- 『cdq分治和多维偏序问题』
更新了三维偏序问题的拓展 cdq分治 \(cdq\)分治是一种由\(IOI\ Au\)选手\(cdq\)提出的离线分治算法,又称基于时间的分治算法. 二维偏序问题 这是\(cdq\)分治最早提出的时候 ...
- P3810 【模板】三维偏序(陌上花开)(CDQ分治)
题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai.b_ibi.c_ici 三个属性,设 f(i) ...
- P3810 【模板】三维偏序(陌上花开)cdq分治
传送门:https://www.luogu.org/problemnew/show/P3810 cdq分治的模板题,第一层外部排序,第二层cdq归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...
- 浅谈CDQ分治与偏序问题
初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...
- $CDQ$分治总结
A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...
随机推荐
- Java String使用总结
1 == 与 equals() 使用==来比较两个primitive主数据类型在意义上相等(是否带有相同的字节组合),或者判断两个引用(如String变量)是否引用同一个对象.使用equals()来判 ...
- docker设置固定ip地址
Docker安装后,默认会创建下面三种网络类型 $ docker network ls NETWORK ID NAME DRIVER SCOPE 9781b1f585ae bridge bridge ...
- ★Linux命令行操作技巧(作为服务器端)
1.统计某个目录下总共有多少个文件(递归统计所有子目录)ls -lR|grep "^-"|wc -l
- [NOIP]2016天天爱跑步
[NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...
- 如何为MySQL服务器和客户机启用SSL
本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: mysql5.7后有ssl新特性 自己搭建mysql ent ...
- abp允许跨域代码,时间转换为固定格式,本地时间
在Global的 Application_BeginRequest方法中: Thread.CurrentThread.CurrentCulture = new CultureInfo("z ...
- 想想我们能拿HoloLens 做点什么
作为一个微软员工,顿时感觉好了很多. 中午吃饭同事们热烈讨论这东东: 1. 看电视 2. 办公 3. 用HoloLens 玩3d 游戏.满公园跑. 4. 看书 5. 开车的时候,实时显示地图 6. 一 ...
- 02 Java类的加载机制
1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构 ...
- MySQL暴错注入方法
mysql暴错注入方法整理,通过floor,UpdateXml,ExtractValue,NAME_CONST,Error based Double Query Injection等方法 1.通过fl ...
- Yii高级模板的安装
1,如果你使用composer来安装的话,执行下边两条命令. composer global require "fxp/composer-asset-plugin:^1.2.0" ...