对CDQ深一步的理解

昨天做了一道CDQ,看了一堆CDQ可做的题,今天又做了一道四维偏序
感觉对CDQ的理解又深了一点,故来写一写现在自己对于CDQ的理解
CDQ其实就是实现了这样的一个问题的转化:
\(a_{l} < a_{l+1} < ... < a_r => (a_l,a_{l+1},...,a_{mid}) \text{都小于} (a_{mid+1},a{mid+2},...,a_r)\)
然后我们就知道这时候左边所有的点都一定小于右边的点
在四维偏序的算法中,那就是左边的点可以对右边的点做出贡献(仅在当前维度下)
这样就强行消除了一个维度的限制.

四维偏序

COGS 2479

题目大意

给定一个有\(n\)个元素的序列,元素编号为\(1~n\),每个元素有三个属性\(a,b,c\),求序列中满足\(i<j\)且\(a_i<a_j\)且\(b_i<b_j\)且\(c_i<c_j\)的数对\((i,j)\)的个数。

题解

我们把下标也看作一个维度,那么这就是个四维偏序
我们在下标的维度上CDQ
然后记录每个元素在第一次CDQ中是较小的还是较大的.
因为只有较小的元素才能对较大的元素做出贡献
只有较大的元素才能接受较小的元素的影响.
所以我们处理出来后这就变成了一个三维偏序
所以我们在对这个序列(CDQ+扫描线+树状数组)求三维偏序即可

Code

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 50010;
struct Node{int a,b,c;bool is_sm;Node(){a=b=c=is_sm = 0;}
}a[maxn],tmp1[maxn],tmp2[maxn];
int c[maxn],n,init_tmp[maxn],ans=0;
#define lowbit(x) (x&-x)
inline void modify(int x,int y){for(;x<=n;x+=lowbit(x)) c[x] += y;
}
inline int query(int x){int ret = 0;for(;x;x-=lowbit(x)) ret += c[x];return ret;
}
void solve2(int l,int r){if(l == r) return ;int mid = l+r >> 1;solve2(l,mid);solve2(mid+1,r);int i = l,j = mid+1,k = l;Node *a = tmp1,*tmp = tmp2;init_tmp[0] = 0;while(i <= mid || j <= r){if((j > r) || (i <= mid && a[i].b < a[j].b)){if( a[i].is_sm){modify(a[i].c,1);init_tmp[++init_tmp[0]] = i;}tmp[k++] = a[i++];}else{if(!a[j].is_sm){ans += query(a[j].c);}tmp[k++] = a[j++];}}for(int i = 1;i<=init_tmp[0];++i) modify(a[init_tmp[i]].c,-1);copy(tmp+l,tmp+r+1,a+l);
}
void solve1(int l,int r){if(l == r) return ;int mid = l+r >> 1;solve1(l,mid);solve1(mid+1,r);int i = l,j = mid+1,k = l;Node *tmp = tmp1;while(i <= mid || j <= r){if((j > r) || (i <= mid && a[i].a < a[j].a)){(tmp[k++] = a[i++]).is_sm = true;}else (tmp[k++] = a[j++]).is_sm = false;}copy(tmp+l,tmp+r+1,a+l);solve2(l,r);
}
int main(){
//  freopen("partial_order.in","r",stdin);
//  freopen("partial_order.out","w",stdout);read(n);for(int i=1;i<=n;++i) read(a[i].a);for(int i=1;i<=n;++i) read(a[i].b);for(int i=1;i<=n;++i) read(a[i].c);solve1(1,n);printf("%d\n",ans);getchar();getchar();return 0;
} 

转载于:https://www.cnblogs.com/Skyminer/p/6405323.html

四维偏序 CDQ套CDQ相关推荐

  1. HDU5126 stars(4维偏序->cdq套cdq+树状数组)

    stars 题目大意: 在一个三维空间当中,每次进行一个操作,添加一个点或者统计空间中的某一个长方体范围内的所有点 三维空间中我们用两个点即可确定一个长方体. 首先效仿平面二维数点的方法,根据容斥原理 ...

  2. 【CJOJ2616】 【HZOI 2016】偏序 I(cdq分治,树状数组)

    传送门 CJOJ Solution 考虑这是一个四维偏序对吧. 直接cdq套在一起,然后这题有两种实现方法(树状数组的更快!) 代码实现1(cdq+cdq+cdq) /*mail: mleautoma ...

  3. 多维偏序总结(CDQ)

    对于一维偏序, 大概就是直接排序, 一般sort()直接解决; 对于二维偏序,(比如有求逆序对)此时就需要用sort()+暴力降维的方法.或者是sort() + 树状数组来解决: 而对于三维偏序, 就 ...

  4. P4849 寻找宝藏(模板:四维偏序)

    stable_sort 保平安. 解析 dp方程显而易见,关键就是如何进行这个四维偏序的转移. 考虑三维偏序(比如拦截导弹)我们是如何做的? 先按照第一维排序,然后分治解决前一半,接下来把前一半的第一 ...

  5. P3810-[模板]三维偏序(陌上花开)【CDQ分治,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3810 题目大意 nnn个三元组(a,b,c)(a,b,c)(a,b,c),f(i)=∑i=1n,j≠i[aj≤a ...

  6. bzoj2683:简单题(树状数组套CDQ分分治)

    CDQ(陈丹琦)分治 CDQ显然是一个人的名字(2008NOI金牌选手陈丹琦) 这种离线的分治算法在算法界被称为"CDQ分治".  首先回忆一下归并排序的分治, 它的操作是将数组二 ...

  7. CDQ分治嵌套模板:多维偏序问题

    CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1struct Node{int a,b,c,d,bg;}; ...

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

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

  9. CDQ分治学习及例题总结

    文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...

最新文章

  1. android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
  2. bzoj2067: [Poi2004]SZN
  3. [爬虫+数据分析] 分析北京Python开发的现状
  4. 一个女程序员的第七年工作总结
  5. 乘法运算-快速傅里叶变换
  6. eclipse光标变成黑块变粗解决办法
  7. python里面的tuple与list对比
  8. htc816t Android go,HTC D816t(Desire D816t 移动4G)一键刷机图文教程详解
  9. java对csv格式的读写操作
  10. MODULE_DEVICE_TABLE【转】
  11. puml绘制思维导图_免费在线思维导图神器 简单又漂亮 比Wodrd好用很多
  12. php查netstat,Netstat命令详解
  13. 工资管理系统数据库设计
  14. npm ERR! code ETIMEDOUTnpm ERR! syscall connectnpm ERR! errno ETIMEDOUTnpm ERR! network request t
  15. AI明星上市受阻,是继续融资还是割肉?
  16. Vue-Router给当前url添加参数时报错 Navigation Duplicated Avoided redundant navigation to current location
  17. 数据结构,关于链表的问题,为何直接free()不会造成断链。引用的好处
  18. 炸了!3年图片都没了!
  19. 高通新款高端芯片抢闸发布,小米将首发,趁机从华为手里抢夺市场
  20. 炸金花游戏(1)--炸金花游戏的模型设计和牌力评估

热门文章

  1. 关于活动对像要注意的问题
  2. 一个C#写的调用外部进程类
  3. Js正则表达式数字或者带小数点的数字
  4. matlab --- 图像处理基础
  5. html5 --- 特性检测
  6. Solr管理页面 上
  7. 395. Longest Substring with At Least K Repeating Characters
  8. Python与操作系统有关的模块
  9. Swoole 源码分析——Server模块之初始化
  10. Flutter - 生成二维码与识别二维码