CDQ分治其实是很简洁、直白的分治算法、、

和树分治差不多,都是处理贡献时扫一遍计算贡献,

它利用了2个单调性和一个选点:

第一遍按 a  sort,保证x单调

分出左右区间,  按b  sort   ,保证两边的y单调

用树状数组,利用z保证只有比z大的有用,只选比z小的点

一共本身二分区间为nlogn,每一层便历n个,快排两个区间n*log(n/2),每个区间调用树状数组logk;

所以复杂度是O(nlog(n)log(k)+nlog(n)*log(n/2)+nlog(n)),是nlog^2n级的

注意:

sort的第二个变量是结束位置,应该是下标+1

树状数组上界不是n而是k

同样的花合在一起,注意影响及贡献和单独的不一样

码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct la
{int x,y,z,gx,daan;
}a[200005];
int tong[200005],n,k,tot,s[4000005],i;
int lowbit(int o)
{
return o&(-o);
}
void jia(int wz,int o)
{for(;wz<=k;wz+=lowbit(wz)){s[wz]+=o;}
}
int qiu(int wz)
{int ans=0;for(;wz>0;wz-=lowbit(wz)){ans+=s[wz];}return ans;
}
bool cmp(la a,la b)
{
if(a.x==b.x)
if(a.y==b.y)
return a.z<b.z;
else return a.y<b.y;
else return a.x<b.x;
}
bool cmp1(la a,la b)
{return a.x<b.x;
}
bool cmp2(la a,la b)
{return a.y<b.y;
}
void cdq(int l,int r)
{if(l==r)return;int i;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);
sort(a+l,a+mid+1,cmp2);
sort(a+mid+1,a+r+1,cmp2);       int z1=l,z2=mid+1;while(z1<=mid&&z2<=r){  if(a[z1].y<=a[z2].y)jia(a[z1].z,a[z1].gx),z1++;else {a[z2].daan+=qiu(a[z2].z);z2++; }}while(z2<=r){a[z2].daan+=qiu(a[z2].z);z2++;}for(i=l;i<z1;i++)jia(a[i].z,-a[i].gx);sort(a+l,a+r+1,cmp1);
}int main()
{scanf("%d%d",&n,&k);for(i=1;i<=n;i++){ scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);}sort(a+1,a+1+n,cmp);for(i=1;i<=n;i++){if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y&&a[i].z==a[i-1].z)a[tot].gx++,a[tot].daan++;else ++tot,a[tot].x=a[i].x,a[tot].y=a[i].y,a[tot].z=a[i].z,a[tot].gx=1;}cdq(1,tot);for(i=1;i<=tot;i++)tong[a[i].daan]+=a[i].gx;for(i=0;i<n;i++)printf("%d\n",tong[i]);}

2017.8.17 陌上花开 思考记录相关推荐

  1. 2017.9.17 kamp 思考记录

    一开始读错题了,以为只有一个座位. 首先,通过从一个点出发,它走过的路径是一个半环,如果把半环补上,那所有的环上的点答案都一样 对于不在环上的点,它一定是沿树上路径到达环上的点 所以剩下的问题就是求每 ...

  2. 2017.9.17 function 思考记录

    这题一眼是奥数题.十分不可做 然后感觉它应该是结论题 然后手玩了几组小数据,之后发现似乎有规律:  2. 4. 6. 8. 10. 这规律也太**了. 然后打了三行,就过了. 这结论竟然猜对了,这题出 ...

  3. 2017.9.17 相关分析 思考记录

    想不明白考场上怎么爆零了.可能太自信了 基本用初中的数学就可以把式子化成要维护的东西,x^2,x*y,x,y    然后就计算就行了 注意:   循环变量作为取值需要long long 不要太自信 不 ...

  4. 2017.9.5 组合数学 思考记录

    这题风格很正统.所以我感觉如果自己能不靠题解把这个题做出来,那应该就学得不错了.. 于是在历尽千辛万苦之后,终于1A了.(事后证明 结论题的结论强行无视 乱搞也是有可能AC的) xym&ISA ...

  5. 2017.9.4 Nim 思考记录

    只要知道nim的结论   这题就是链剖板子题.1A 注意bzoj 的  换行符是     \r!!      \r!!      \r!! 就说一下链剖的易错点吧: 1.记录父节点.sz.深度 2.当 ...

  6. 2017.5.6 子矩阵 思考记录

    其实这个题挺裸的dp 主要是你需要dfs+dp   不然直接dp肯定是不行的 而且写完代码一定检查一下..变量名最好要用易懂的,,不然容易错    用了3个错误的变量名竟然有90分 码: #inclu ...

  7. 2017.10.28 排序 思考记录

    这个题有一种套路,就是大小关系转化成01串,这样就变成了二分检验问题,, 就是把排序变成区间修改,然后单点查询.. 把所有比他小的赋成0,比他大的赋成1 然后判断要求位是0还是1来判断答案与当前值的大 ...

  8. 2017.10.28 压缩 思考记录

    这个题首先要知道M和R不是栈的搭配,是贪心的搭配,,就是向左找到第一个M.. 如 abababab cdcdcdcd abababab cdcdcdcd   = abRRcdcdcdcdR != Ma ...

  9. 2017.10.6 单词 思考记录

    少有的会做的ac自动机题 .这个题是匹配模式串. 所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑 由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路 ...

最新文章

  1. 推荐10个小众简约,但是实用的软件和网站
  2. openwrt监控linux,OpenWRT上判断客户端在线个数
  3. HDU5706 GirlCat
  4. when and where is gt_cache_in_memory filled
  5. C89与C99标准比较
  6. paging library java_Android官方分页组件介绍之Paging的使用详解
  7. python装饰器两层和三层_2020 python学习第十六天————三层装饰器与迭代器
  8. 拓端tecdat|R语言对BRFSS数据探索回归数据分析
  9. H5编辑器核心算法和思想-遁地龙卷风
  10. 浅谈测试小白到测试大牛的成长历程(分四个境界)
  11. 微机 —— 可编程并行接口芯片8255A 应用
  12. JPEG2000帧格式详解(一)
  13. 自定义联系人快速索引栏
  14. Javascript技巧之对话窗口
  15. Cython的原理:知其然,知其所以然
  16. 音视频行业玩家必读,如何实现生态合作+商业变现
  17. 大规模 Web 数据采集的终极开源方案 - PulsarRPA
  18. 亚马逊 广告接口对接 amazon advertising
  19. Spring所有注解大揭秘
  20. 最新 2020 Android 开发者知识体系

热门文章

  1. SpringCloud与Hystrix断路器
  2. MATLAB矩阵添加新元素
  3. Windows 10标题栏显示颜色
  4. Java中的标识符及其命名规则
  5. java常用类库_【知识点】Java常用类库
  6. tomcat人数限制_Tomcat 七最大并发连接数的正确修改方法
  7. signature=14a3e4f784cf9004647ea52bac22e550,维族老年慢性阻塞性肺疾病患者合并肺动脉高压的临床研究...
  8. react月份选择控件_看我的案例:用react写一个日历控件!
  9. python找图片不同_用openCV和Python 实现图片对比,并标识出不同点的方式
  10. a = 3 中3在栈还是堆_阳台要不要装推拉门?纠结3次后还是装错了,返工中