经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
[luogu3810][bzoj3262][陌上花开]
来源:cnblogs  作者:wxyww  时间:2018/12/12 9:54:33  对本文有异议

题目链接

思路

听说可以CDQ分治,然后我不会,所以我写树套树

首先肯定先按照a拍个序。然后就成了在b,c这两个数组中查询了。用一个树状数组套treap来维护。当插入一个数的时候,就在树状数组的b这个位置的treap里加入一个c。然后查询的时候就直接把小于等于c的数的个数进行前缀和就行了。

注意题目里面是小于等于。所以在按照a加入的时候,要把a相同的数一起加进去。

代码

  1. /*
  2. * @Author: wxyww
  3. * @Date: 2018-12-11 14:01:32
  4. * @Last Modified time: 2018-12-11 14:28:01
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cmath>
  10. #include<ctime>
  11. #include<bitset>
  12. #include<map>
  13. #include<algorithm>
  14. using namespace std;
  15. typedef long long ll;
  16. const int N = 100000 + 100,M = 200000 + 100;
  17. #define ls TR[cur].ch[0]
  18. #define rs TR[cur].ch[1]
  19. ll read() {
  20. ll x=0,f=1;char c=getchar();
  21. while(c<'0'||c>'9') {
  22. if(c=='-') f=-1;
  23. c=getchar();
  24. }
  25. while(c>='0'&&c<='9') {
  26. x=x*10+c-'0';
  27. c=getchar();
  28. }
  29. return x*f;
  30. }
  31. struct node {
  32. int a,b,c;
  33. }e[N];
  34. bool operator < (const node &x,const node &y) {
  35. return x.a < y.a;
  36. }
  37. int rt[N];
  38. int tot = 0;
  39. namespace treap {
  40. struct NODE {
  41. int ch[2],id,val,siz,cnt;
  42. }TR[M * 30];
  43. void up(int cur) {
  44. TR[cur].siz = TR[ls].siz + TR[rs].siz + TR[cur].cnt;
  45. }
  46. void rotate(int &cur,int f) {
  47. int son = TR[cur].ch[f];
  48. TR[cur].ch[f] = TR[son].ch[f ^ 1];
  49. TR[son].ch[f ^ 1] = cur;
  50. up(cur);cur = son;up(cur);
  51. }
  52. void insert(int &cur,int val) {
  53. if(!cur) {
  54. cur = ++tot;
  55. TR[cur].val = val;
  56. TR[cur].cnt = TR[cur].siz = 1;
  57. TR[cur].id = rand();
  58. return;
  59. }
  60. TR[cur].siz++;
  61. if(TR[cur].val == val) {TR[cur].cnt++;return;}
  62. int d = val > TR[cur].val;
  63. insert(TR[cur].ch[d],val);
  64. if(TR[TR[cur].ch[d]].id < TR[cur].id) rotate(cur,d);
  65. }
  66. int Rank(int cur,int val) {
  67. int ans = 0;
  68. while(cur) {
  69. if(val == TR[cur].val) return ans + TR[ls].siz + TR[cur].cnt;
  70. if(val > TR[cur].val) ans += TR[ls].siz + TR[cur].cnt,cur = rs;
  71. else cur = ls;
  72. }
  73. return ans;
  74. }
  75. }
  76. using namespace treap;
  77. int tree[M],K;
  78. void add(int pos,int c) {
  79. while(pos <= K) {
  80. insert(tree[pos],c);
  81. pos += pos & -pos;
  82. }
  83. }
  84. int query(int pos,int x) {
  85. int ans = 0;
  86. while(pos >= 1) {
  87. ans += Rank(tree[pos],x);
  88. pos -= pos & -pos;
  89. }
  90. return ans;
  91. }
  92. int have_ad[N];
  93. int ans[N];
  94. int main() {
  95. int n = read();K = read();
  96. for(int i = 1;i <= n;++i) e[i].a = read(),e[i].b = read(),e[i].c = read();
  97. sort(e + 1,e + n + 1);
  98. for(int i = 1;i <= n;++i) {
  99. if(!have_ad[i]) add(e[i].b,e[i].c);
  100. int js = 1;
  101. while(e[i + js].a == e[i].a && !have_ad[i]) {
  102. have_ad[i + js] = 1;
  103. add(e[i + js].b,e[i + js].c);
  104. js++;
  105. }
  106. have_ad[i] = 1;
  107. ans[query(e[i].b,e[i].c)]++;
  108. }
  109. for(int i = 1;i <= n;++i) printf("%d\n",ans[i]);
  110. return 0;
  111. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号