CDQ三维偏序

给出n个点(x,y,z)

每个点求出x'<=x,y'<=x,z'<=x的点(x',y',z')有多少个

第一维 快排 第二维 CDQ 第三维 树状数组

CDQ

先按x第一关键字,y第二关键字,z第三关键字快排

CDQ先处理左半边,再处理右半边

现在满足左半边的x全部小于右半边的x

那就只用考虑y,z

将左半边的y排序,右半边的y排序

像two-pionter那样扫一下用树状数组维护z

为了节省时间不清空树状数组开个时间戳

对于相等权值需要特判的,cdq全部算完之后再按一开始那样快排

从后往前扫一遍用后面的更新前面

快排

wa了7发,第一次知道快排是左闭右开区间

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <cctype>
  7. using namespace std;
  8. typedef long long LL;
  9. const int M=100007;
  10. inline int rd(){
  11. int x;
  12. scanf("%d",&x);
  13. return x;
  14. }
  15. int tcas;
  16. int n;
  17. int ans[M];
  18. int tms[M];
  19. int c[M];
  20. int T;
  21. struct node{
  22. int x,y,z,id,dp;
  23. void input(int ii){x=rd(),y=rd(),z=rd(),id=ii;dp=0;}
  24. }a[M];
  25. bool operator ==(node x,node y){
  26. return x.x==y.x&&x.y==y.y&&x.z==y.z;
  27. }
  28. bool cmp(node x,node y){
  29. if(x.x==y.x&&x.y==y.y)return x.z<y.z;
  30. if(x.x==y.x)return x.y<y.y;
  31. return x.x<y.x;
  32. }
  33. bool cmpx(node x,node y){return x.x<y.x;}
  34. bool cmpy(node x,node y){return x.y<y.y;}
  35. inline int lb(int x){return x&(-x);}
  36. void ins(int x,int d){
  37. for(;x<M;x+=lb(x)){
  38. if(tms[x]!=T) {c[x]=0;tms[x]=T;}
  39. c[x]+=d;
  40. }
  41. }
  42. int get(int x){
  43. int res=0;
  44. for(;x>0;x-=lb(x)){
  45. if(tms[x]==T) res+=c[x];
  46. }
  47. return res;
  48. }
  49. void calc(int l,int r){
  50. if(l==r)return;
  51. int i,j,mid=l+r>>1;
  52. calc(l,mid);
  53. calc(mid+1,r);
  54. sort(a+l,a+mid+1,cmpy);
  55. sort(a+mid+1,a+r+1,cmpy);
  56. T++;
  57. for(i=l,j=mid+1;j<=r;j++){
  58. for(;a[i].y<=a[j].y&&i<=mid;i++){
  59. ins(a[i].z,1);
  60. }
  61. a[j].dp+=get(a[j].z);
  62. }
  63. }
  64. int main(){
  65. int i;
  66. tcas=rd();
  67. while(tcas--){
  68. n=rd();
  69. for(i=1;i<=n;i++) a[i].input(i);
  70. sort(a+1,a+n+1,cmp);
  71. calc(1,n);
  72. sort(a+1,a+n+1,cmp);
  73. for(i=n-1;i>0;i--) if(a[i]==a[i+1]) a[i].dp=a[i+1].dp;
  74. for(i=1;i<=n;i++) ans[a[i].id]=a[i].dp;
  75. for(i=1;i<=n;i++) printf("%d\n",ans[i]);
  76. }
  77. return 0;
  78. }

CDQ学习笔记的更多相关文章

  1. CDQ 学习笔记

    CDQ分治 CDQ(陈丹琦)分治是一种特殊的分治方法. 它只能处理非强制在线的问题. CDQ分治在维护一些动态的凸包.半平面交问题也有一定应用,然而本渣渣并不会. CDQ分治基于时间分治,整体二分基于 ...

  2. 学习笔记 | CDQ分治

    目录 前言 啥是CDQ啊(它的基本思想) 例题 后记 参考博文 前言 博主太菜了 学习快一年的OI了 好像没有什么会的算法 更寒碜的是 学一样还不精一样TAT 如有什么错误请各位路过的大佬指出啊感谢! ...

  3. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

  4. 【框架】Django入门学习笔记

    教程 Demo 教材2 教材3 [转] Django处理请求的工作机制 记住: 1.用manage.py runserver 启动Django服务器时就载入了在同一目录下的settings.py.该文 ...

  5. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  6. KD-Tree 学习笔记

    这是一篇又长又烂的学习笔记,请做好及时退出的准备. KD-Tree 的复杂度大概是 \(O(n^{1-\frac{1}{k}})\) \(k\) 是维度 由于网上找不到靠谱的证明,咕了. 会证明之后再 ...

  7. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

随机推荐

  1. Oracle XE手动建立数据库实例

    参考资料为: [Oracle XE系列之三]使用OMF方式手工创建Oracle XE数据库 - 王立夫 - 博客园http://www.cnblogs.com/opfo/p/5056122.html ...

  2. div的水平和垂直居中

    CSS实现div的水平居中 div的水平居中可以通过margin设置为0 auto实现. .myDiv { width: 200px; height: 100px; margin: 0 auto; } ...

  3. 正则匹配闭合HTML标签(支持嵌套)

    任何复杂的正则表达式都是由简单的子表达式组成的,要想写出复杂的正则来,一方面需要有化繁为简的功底,另外一方面,我们需要从正则引擎的角度去思考问题.关于正则引擎的原理,推荐<Mastering R ...

  4. win tomcat

    D:\tomcat8080\binstartup.bat rem ------------------------------------------------------------------- ...

  5. dos 命令帮助文档chm

    http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds.mspx?mfr=true

  6. windows server 2012 使用问题

    1.端口映射,把宿主机的端口映射到hyper-v创建的虚拟机上 访问宿主机的公网IP的某个端口,就等于访问这个虚拟机上的端口 具体实现: 在宿主机上命令行输入 添加一个端口映射 netsh inter ...

  7. PHP框架模板原理

           PHP框架现在是一种很流行的东西了,很多朋友开发应用与网站都会选择一个PHP框架或模板了,下面我们来看看PHP框架是如何实现的吧. 本文主要来聊聊框架理论,但不针对任何一款框架,不过任何 ...

  8. 【01-05】hibernate BaseDao

    BaseDao接口定义 package org.alohaworld.util.dao; import java.io.Serializable; import java.util.List; imp ...

  9. mybatis中#{}与${}的差别(如何防止sql注入)

    默认情况下,使用#{}语法,MyBatis会产生PreparedStatement语句中,并且安全的设置PreparedStatement参数,这个过程中MyBatis会进行必要的安全检查和转义. # ...

  10. eclipse SVN Android项目出错,程序老闪退

    百度得知是.so文件被SVN客户端默认为是链接后的文件,认为是不提交的.因此需要将.so文件手动添加到版本控制.