Description

有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。
现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。
定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。
显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。

Input

第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值。
以下N行,每行三个整数si, ci, mi (1 <= si, ci, mi <= K),表示第i朵花的属性

Output

包含N行,分别表示评级为0...N-1的每级花的数量。

Sample Input

10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1

Sample Output

3
1
3
0
1
0
1
0
0
1

解题思路:

CDQ分治很好的模板。

运用了线段树/树状数组扫描线的思想。

或者说是离线解题时的控制端点动态更新。

动态处理问题获得解还是非常神的思路。

相当于将解集拆分成若干份,每份使用动态统计。

换句话说,就是将一定范围内的数据配对时间复杂度降低。

注意要撤销操作。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. struct pnt{
  6. int x,y,z,f,w;
  7. bool friend operator == (pnt a,pnt b)
  8. {
  9. return a.x==b.x&&a.y==b.y&&a.z==b.z;
  10. }
  11. bool friend operator != (pnt a,pnt b)
  12. {
  13. return !(a.x==b.x&&a.y==b.y&&a.z==b.z);
  14. }
  15. }p[],q[];
  16. int n,k;
  17. int cnt;
  18. int d[];
  19. int line[];
  20. int has[];
  21. int lowbit(int x)
  22. {
  23. return x&(-x);
  24. }
  25. bool cmx(pnt a,pnt b)
  26. {
  27. if(a.x==b.x&&a.y==b.y)
  28. return a.z<b.z;
  29. if(a.x==b.x)
  30. return a.y<b.y;
  31. return a.x<b.x;
  32. }
  33. bool cmy(pnt a,pnt b)
  34. {
  35. if(a.x==b.x&&a.y==b.y)
  36. return a.z<b.z;
  37. if(a.y==b.y)
  38. return a.x<b.x;
  39. return a.y<b.y;
  40. }
  41. void add(int p,int v)
  42. {
  43. while(p<=k)
  44. {
  45. line[p]+=v;
  46. p+=lowbit(p);
  47. }
  48. return ;
  49. }
  50. int ask(int p)
  51. {
  52. int ans=;
  53. while(p)
  54. {
  55. ans+=line[p];
  56. p-=lowbit(p);
  57. }
  58. return ans;
  59. }
  60. void wrk(int l,int r)
  61. {
  62. int m=(l+r)>>;
  63. sort(p+l,p+m+,cmy);
  64. sort(p+m+,p+r+,cmy);
  65. int tmp=-;
  66. for(int i=l,j=m+;j<=r;j++)
  67. {
  68. for(;i<=m&&p[i].y<=p[j].y;i++)
  69. {
  70. add(p[i].z,p[i].w);
  71. tmp=i;
  72. }
  73. p[j].f+=ask(p[j].z);
  74. }
  75. for(int i=l;i<=tmp;i++)
  76. add(p[i].z,-p[i].w);
  77. }
  78. void cdq(int l,int r)
  79. {
  80. if(l==r)
  81. return ;
  82. int m=(l+r)>>;
  83. cdq(l,m);
  84. cdq(m+,r);
  85. wrk(l,r);
  86. }
  87. int main()
  88. {
  89. scanf("%d%d",&n,&k);
  90. for(int i=;i<=n;i++)
  91. scanf("%d%d%d",&q[i].x,&q[i].y,&q[i].z);
  92. sort(q+,q+n+,cmx);
  93. int wgt=;
  94. for(int i=;i<=n;i++)
  95. {
  96. wgt++;
  97. if(q[i]!=q[i+])
  98. {
  99. p[++cnt]=q[i];
  100. p[cnt].w=wgt;
  101. wgt=;
  102. }
  103. }
  104. swap(cnt,n);
  105. cdq(,n);
  106. for(int i=;i<=n;i++)
  107. has[p[i].f+p[i].w-]+=p[i].w;
  108. for(int i=;i<cnt;i++)
  109. printf("%d\n",has[i]);
  110. return ;
  111. }

BZOJ3262: 陌上花开(三维偏序,CDQ分治)的更多相关文章

  1. BZOJ3262 陌上花开 —— 三维偏序 CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit ...

  2. bzoj3262: 陌上花开 三维偏序cdq分治

    三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...

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

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

  4. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  5. BZOJ 3262 陌上花开 (三维偏序CDQ+树状数组)

    题目大意: 题面传送门 三维偏序裸题 首先,把三元组关于$a_{i}$排序 然后开始$CDQ$分治,回溯后按$b_{i}$排序 现在要处理左侧对右侧的影响了,显然现在左侧三元组的$a_{i}$都小于等 ...

  6. BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...

  7. bzoj3262陌上花开 三维数点 cdq+树状数组

    大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...

  8. 三维偏序[cdq分治学习笔记]

    三维偏序 就是让第一维有序 然后归并+树状数组求两维 cdq+cdq不会 告辞 #include <bits/stdc++.h> // #define int long long #def ...

  9. BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)

    一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w; //for(; x <= n; ...

随机推荐

  1. Swift:UIKit中Demo(一)

    关于Swift的基本概念及语法知识.我在前面的章节中已经介绍了非常多.这一节和下一节主要有针对性的解说Swift在实际UIKit开发中的使用场景及注意点.先来看看Demo的终于效果图. Demo分析: ...

  2. ios提交程序后出现的各种问题

    提交了几次都被feedback.下面均为本人碰到过得问题.希望对大家解决提交问题有帮助 Number    one:PLA 3.3.12 We found your app uses the iOS ...

  3. vue22 路由

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. input file HTML控件控制

    网页上添加一个input file HTML控件: 1 <input id="File1" type="file" /> 默认是这样的,所有文件类型 ...

  5. thinkserer TD350 系统损坏后,数据恢复及系统重做过程

    电脑配置: 联想服务器 TD350   E5-2609V4 2*8G 2*4T+R1 塔式 单电 1.系统恢复: 试过很多种方法,均无效 2.数据恢复:  重新安装系统后,直接在D盘查找 , 原C盘的 ...

  6. python 深浅拷贝小记

    浅拷贝:只拷贝第一层的数据 深拷贝:相当于克隆 一份,也就是完全复制,和被克隆对象完全没关系. 浅拷贝示例:先定义一个列表 >>> s = [1,'alex','alvin'] &g ...

  7. 【Django】模板系统

    目录 一.变量 二.过滤器 Filters 2. length 3. filesizeformat 4. slice 5. add 6. first.last 7. join 8. truncatec ...

  8. jQuery判断字符串是否含有中文字符

    //判断字符串是不是中文String.prototype.isChinese = function () {    var reg = /[^\x00-\xff]/ig;//判断是否存在中文和全角字符 ...

  9. 保留原先小程序名称 更改微信小程序主体

    首先给小程序开发者普及一些官方消息: 1.目前官方是不允许修改已经认证的小程序主体信息!(公众号可以修改) 2.小程序与公众号的名称是全平台唯一,即如果小程序叫‘ABC’其他小程序和公众号就不能存在‘ ...

  10. POJ 1466 Girls and Boys (匈牙利算法 最大独立集)

    Girls and Boys Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 10912   Accepted: 4887 D ...