【题意】三维偏序,给定n个点(x,y,z),求每个点和(0,0,0)组成空间中的点数,有重点。1<=x,y,z<=2*10^5,1<=n<=10^5。

【算法】CDQ分治+树状数组

【题解】CDQ算法知识

三维偏序,一维排序扫描线(x),一维树状数组前缀和(y),一维CDQ分治(z作为时间维)。

1.将重复的点统一为一个并附加数量的属性。

2.将z作为时间维,按照z-x-y排序后对z重编号为1~n(时间维不允许重复数字,否则无法分治),再按x-y-z排序(时间维依然要作为第三关键字排序)。

3.CDQ分治,最后得到的a[]数组自然变成了按照z-x-y排序的结果

4.统计答案,d[ans[i]+a[i].w-1]+=a[i].w。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cctype>
  4. #include<algorithm>
  5. #define lowbit(x) (x&-x)
  6. using namespace std;
  7. int read(){
  8. char c;int s=,t=;
  9. while(!isdigit(c=getchar()))if(c=='-')t=-;
  10. do{s=s*+c-'';}while(isdigit(c=getchar()));
  11. return s*t;
  12. }
  13. const int maxn=;
  14. struct cyc{int t,x,y,w;}a[maxn],b[maxn];
  15. int n,m,c[maxn],d[maxn],ans[maxn];
  16. bool cmp(cyc a,cyc b){return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.t<b.t);}
  17. bool cmp2(cyc a,cyc b){return a.t<b.t||(a.t==b.t&&a.x<b.x)||(a.t==b.t&&a.x==b.x&&a.y<b.y);}
  18. void modify(int x,int k){for(int i=x;i<=m;i+=lowbit(i))c[i]+=k;}
  19. int find(int x){int as=;for(int i=x;i>=;i-=lowbit(i))as+=c[i];return as;}
  20. void CDQ(int l,int r){
  21. if(l==r)return;
  22. int mid=(l+r)>>;
  23. for(int i=l;i<=r;i++)if(a[i].t<=mid)modify(a[i].y,a[i].w);else ans[a[i].t]+=find(a[i].y);
  24. for(int i=l;i<=r;i++)if(a[i].t<=mid)modify(a[i].y,-a[i].w);
  25. int x1=l-,x2=mid;
  26. for(int i=l;i<=r;i++)if(a[i].t<=mid)b[++x1]=a[i];else b[++x2]=a[i];
  27. for(int i=l;i<=r;i++)a[i]=b[i];
  28. CDQ(l,mid);CDQ(mid+,r);
  29. }
  30. int main(){
  31. n=read();m=read();int N=n;
  32. for(int i=;i<=n;i++)a[i].t=read(),a[i].x=read(),a[i].y=read();
  33. sort(a+,a+n+,cmp2);
  34. int tot=,num=;
  35. for(int i=;i<=n;i++){
  36. num++;
  37. if(a[i].t!=a[i+].t||a[i].x!=a[i+].x||a[i].y!=a[i+].y){
  38. b[++tot]=a[i];b[tot].w=num;
  39. num=;
  40. }
  41. }
  42. n=tot;
  43. for(int i=;i<=n;i++)a[i]=b[i],a[i].t=i;
  44. sort(a+,a+n+,cmp);
  45. CDQ(,n);
  46. for(int i=;i<=n;i++)d[ans[i]+a[i].w-]+=a[i].w;
  47. for(int i=;i<N;i++)printf("%d\n",d[i]);
  48. return ;
  49. }

【BZOJ】3262: 陌上花开的更多相关文章

  1. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  2. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  3. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  4. BZOJ 3262 陌上花开 ——CDQ分治

    [题目分析] 多维问题,我们可以按照其中一维排序,然后把这一维抽象的改为时间. 然后剩下两维,就像简单题那样,排序一维,树状数组一维,按照时间分治即可. 挺有套路的一种算法. 时间的抽象很巧妙. 同种 ...

  5. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. #include<iostream> #include<cstdio ...

  6. BZOJ 3262 陌上花开 CDQ分治

    = =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...

  7. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  8. 【刷题】BZOJ 3262 陌上花开

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  9. BZOJ 3262: 陌上花开 CDQ

    这个题大部分人用了离散然后水之,然而.....作为一只蒟蒻我并没有想到离散,而是直接拿两个区间一个对应n,一个对应k来搞,当然这两个区间是对应的,我把第一维排序,第二维CDQ,第三维树状数组,然而由于 ...

  10. bzoj 3262 陌上花开 【CDQ分治】

    三维偏序 首先把所有花按 x一序,y二序,z三序 排序,然后去重,con记录同样的花的个数,然后进行cdq 现在假设有[l.r]区间,其中[l,mid] [mid+1,r],已经递归处理完毕.我们把区 ...

随机推荐

  1. 跨域写cookie

    假设a站想往b站写cookie,那么目前有两种方案,参考如下: 第一种(使用jsonp): a站js代码如下: $.ajax({ url: 'http://www.b.com/jsonp.jsp?do ...

  2. EF 联合查询

    EF 文章表和标签表联合查询标签id在dis中的文章,还不知道性能如何 var query = tagRepo.Entities.Include("Tags").Where(t = ...

  3. Java实现的词频统计——单元测试

    前言:本次测试过程中发现了几个未知字符,这里将其转化为十六进制码对其加以区分. 1)保存统计结果的Result文件中显示如图: 2)将其复制到eclipse环境下的切分方法StringTokenize ...

  4. Cmder命令行工具在Windows系统中的配置

    一.Cmder简介 Cmder:一款用于Windows系统中,可增强传统cmd命令行工具的控制台模拟器(类似于Linux系统中的终端控制窗口) 特点: 无需安装,解压即用 可使用较多Linux命令,如 ...

  5. Win2019 显示 SMBV1 协议不安全的处理

    1. 登录有问题. 报错 [Window Title] \\10.100.1.163 [Content] \\10.100.1.163 因为文件共享不安全,所以你不能连接到文件共享.此共享需要过时的 ...

  6. linux下c/c++的文件操作

    opendir,readdir,closedir, stat()查询文件状态 open(), O_TRUNC这个Flag会把打开的文件清零... 文件锁:fcntl, F_GETLK , F_SETL ...

  7. 利用书签功能对TDBGrid控件中多个记录的处理

    DELPHI 的TDBGrid 控 件 主 要 用 来 处 理 数 据 表, 它 的 属 性 中 有 一 个dgMultiSelect, 若 此 属 性 设 定 为TRUE, 则 可 以 选 中 多 ...

  8. 分页---Vue+.net+bootstrap实现

    通过学习Vue,的确觉的Vue的双向绑定使用起来十分方便,因此研究了一下列表显示时分页的实现,这里我使用了bootstrap的样式,所以在页面中引用bootstrap的样式文件,后台提数据源使用.ne ...

  9. Vue.js 判断对象属性是否存,不存在添加

    Vue.set是可以对对象添加属性的,这里item对象添加一个checked属性 //if(typeof item.checked=='undefined'){if(!this.item.checke ...

  10. LBP纹理特征[转自]

    LBP方法(Local binary patterns)是一个计算机视觉中用于图像特征分类的一个方法.LBP方法在1994年首先由T. Ojala, M.Pietikäinen, 和 D. Harwo ...