前言
因为中国集训队的大佬们总会发明一些新的东西,所以中国的计算机竞赛水平才会一直处于国际前沿,而cdq分治也是某一年的集训队成员发明的算法。


什么是CDQ分治
cdq分治是一种分治(这不是废话嘛),和一般的分治一样,它先考虑前半部分,再考虑后半部分,再考虑前半部分对后半部分的影响,而cdq分治的精髓就在于处理前半部分对后半部分的影响。


例题:陌上花开
经典的三维偏序问题,我们可以用cdq来解决。
我们先不考虑有重复的问题。
我们先通过依次排序使s变得有序,去掉一维,再通过分治去掉一维。具体是每次将当前区间分为左边和右边,左边编号为1,右边编号为2,再按c排一边序,只考虑编号为1的花对编号为2的花的影响,每次遇到编号为1的话将他的m加入平衡树,遇到编号为2的花查询当前平衡树中m小于等于自身的,即可顺利解决这题了。
代码:

#include <bits/stdc++.h>
using namespace std;const int maxn=1e5+1000;
const int inf=1e7;
struct stu
{int x,y,z,num;friend bool operator == (stu t1,stu t2){if(t1.x==t2.x&&t1.y==t2.y&&t1.z==t2.z) return 1;return 0;}
}d[maxn];
struct lily
{int y,z,type,id,num;
}a[maxn];
int ans[maxn],level[maxn],cnt,n,k1;bool cmp(lily t1,lily t2)
{if(t1.y!=t2.y) return t1.y<t2.y;else if(t1.z!=t2.z) return t1.z<t2.z;else return t1.type<t2.type;
}bool cmp1(stu t1,stu t2)
{if(t1.x!=t2.x) return t1.x<t2.x;else if(t1.y!=t2.y) return t1.y<t2.y;else return t1.z<t2.z;
}struct Splay_tree
{int root,val[maxn],c[maxn][2],fa[maxn],size[maxn],num[maxn];void pushup(int x){size[x]=size[c[x][0]]+size[c[x][1]]+num[x];}void rotate(int x){int y=fa[x],z=fa[y],k=c[y][1]==x,w=c[x][!k];c[z][c[z][1]==y]=x,c[x][!k]=y,c[y][k]=w;if(w) fa[w]=y;fa[y]=x;fa[x]=z;pushup(y);pushup(x);}void splay(int x,int tar){while(fa[x]!=tar){int y=fa[x],z=fa[y];if(z!=tar) rotate((c[y][1]==x)^(c[z][1]==y)?x:y);rotate(x);}if(tar==0) root=x;}void insert(int val1,int num1){int now=root,f=0;while(now&&val[now]!=val1) { f=now;now=c[now][val1>val[now]]; }if(now==0){now=++cnt;val[now]=val1;size[now]=num1;num[now]=num1;c[now][0]=c[now][1]=0;fa[now]=f;if(f==0) root=now;else { c[f][val1>val[f]]=now;splay(now,0); }}else{num[now]+=num1;pushup(now);splay(now,0);}}void find(int val1){int now=root;while(c[now][val1>val[now]]&&val[now]!=val1) now=c[now][val1>val[now]];splay(now,0);}int query(int val1){find(val1);return size[c[root][0]]+num[root]*(val[root]<=val1);}void init(){root=0;cnt=0;c[0][0]=c[0][1]=val[0]=num[0]=size[0]=fa[0]=0;}}T;void cdq(int l,int r)
{if(l==r) return;T.init();
//    T.root=0;cnt=0;int mid=(l+r)>>1;for(int i=l;i<=mid;i++) { a[i].y=d[i].y;a[i].z=d[i].z;a[i].type=0;a[i].num=d[i].num;a[i].id=i; }for(int i=mid+1;i<=r;i++) { a[i].y=d[i].y;a[i].z=d[i].z;a[i].type=1;a[i].num=d[i].num;a[i].id=i; }sort(a+l,a+r+1,cmp);
//    for(int i=l;i<=r;i++) cout<<a[i].id<<' '; cout<<endl;for(int i=l;i<=r;i++){if(!a[i].type)T.insert(a[i].z,a[i].num);else{int kk=T.query(a[i].z);level[a[i].id]+=kk;}}cdq(l,mid);cdq(mid+1,r);
}int main()
{scanf("%d%d",&n,&k1);for(int i=1;i<=n;i++) { scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].z);d[i].num=1; }sort(d+1,d+1+n,cmp1);d[0].x=d[0].y=d[0].z=-inf;int n2=0;for(int i=1;i<=n;i++){if(d[i]==d[n2]) d[n2].num++;else d[++n2]=d[i];}for(int i=1;i<=n2;i++) level[i]=d[i].num-1;
//    for(int i=1;i<=n2;i++) printf("%d %d %d %d\n",d[i].x,d[i].y,d[i].z,d[i].num);cdq(1,n2);
//    for(int i=1;i<=n2;i++) printf("%d\n",level[i]);for(int i=1;i<=n2;i++) ans[level[i]]+=d[i].num;for(int i=0;i<=n-1;i++) printf("%d\n",ans[i]);return 0;
}


CDQ分治——学习笔记相关推荐

  1. [摸鱼]cdq分治 学习笔记

    待我玩会游戏整理下思绪(分明是想摸鱼 cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法 对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态 ...

  2. cdq分治 学习笔记

    什么是 c d q cdq cdq 分治 一种很优美的分治,具体来说,我们解决 [ l , r ] [l,r] [l,r] 这个,跟普通的分治大体思路一样,也是先分治 [ l , m i d ] [l ...

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

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

  4. 边分治学习笔记(bzoj2870)

    如果点分治的话,那个取最小点权操作很难合并,不过树可以点分治,那自然也可以边分治.我们每次找到一条边,使得删掉这条边后的两个连通块中最大的那个的大小尽可能小,然后处理经过这条边的路径信息-- 桥豆麻袋 ...

  5. [学习笔记]CDQ分治

    分治,考虑前一半对后一半的影响. (和一般分治不太相同的思想是,一般分治不分谁对谁的影响,跨mid的都要统计.(全局变量统计) 而CDQ貌似要落脚到前一半对后一半的影响上,也就是贡献在后一半统计,由前 ...

  6. 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治

    上午的学习学会了整体二分,下午学了cdq分治 发现了二者的区别: 整体二分的主体是在不断地二分答案(把所有询问二分),而cdq分治则是在不断地二分操作. 当然同样的,cdq分治的复杂度也是与区间长度正 ...

  7. 【cdq分治】cdq分治与整体二分学习笔记Part1.整体二分

    之所以把cdq分治和整体二分放在一起学习,是因为他们两个实在太像了-不管是做法还是代码- 感觉整体二分可能会比cdq分治稍微简单那么一点点?所以先学整体二分. 整体二分是对答案进行二分,其具体操作如下 ...

  8. 【教程】简易CDQ分治教程学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  9. [偏序关系与CDQ分治]【学习笔记】

    组合数学真是太棒了 $CDQ$真是太棒了(雾 参考资料: 1.<组合数学> 2.论文 课件 很容易查到 3.sro __stdcall 偏序关系 关系: 集合$X$上的关系是$X$与$X$ ...

最新文章

  1. 中国最厉害的人都上过这所最穷的大学!
  2. CDH6.3.2默认管理端口是7180,HDFS相关端口
  3. LintCode 402: Continuous Subarray Sum
  4. python 多线程并发编程(生产者、消费者模式),边读图像,边处理图像,处理完后保存图像实现提高处理效率
  5. html信号动画,HTML5 Canvas火箭着陆和雷达信号动画
  6. 57 - 算法 -贪心算法 - 区间不相交问题
  7. 实习 | 京东金融个人风险管理中心(地点:北京)
  8. 几种比较好用的连接PostgreSQL的客户端
  9. 重启计算机找不到打印机,如何解决重启后打印机找不到设备
  10. python中的wait和notify
  11. BAT程序员轻轻松松拿20k?学会这些涨薪秘籍你也行!
  12. MySql简单入门_第四篇 高级使用(4)_触发器
  13. 5. PHP 输出图像 imagegif 、imagejpeg 与 imagepng 函数
  14. 从Page结构来看达梦数据库是不是纯自研
  15. MathType6.9安装后,office16打开报错(DLL找不到)的解决方法
  16. 南华大学计算机学院王玉锋,喜报!南华大学和王玉锋同学双双获奖!
  17. 美貌智慧不可兼得?超模琳赛 斯科特变身程序员
  18. 数据结构C++——二叉树的实现
  19. 嵌入式开发:变得更加敏捷的5个技巧
  20. python如何获取传感器数据_连接获取传感器数据的几大方法

热门文章

  1. DC-DC电源模块的九个主要性能指标和作用
  2. 1. NETSDK1141    无法解析位于  global.json 中指定的 .NET SDK 版本
  3. 这些老系统代码,是猪写的么?
  4. Tecohoo VD-182U 全高清视频会议摄像机
  5. 微信公众号js-sdk定位 获取经纬度和详细位置
  6. 动态链接库、静态链接库
  7. 小米双剑出鞘,红米2、小米4S所到之处尸横满地?
  8. 解决win10下栏不显示电池电量图标问题
  9. python字符串转整数
  10. jsonNode转化为jsonObject