树套树


  orz zyf

  这题的思路……算是让我了解到了树套树的一种用途吧

三维。。。第一维排序,第二维树状数组,第三维treap
具体实现就是每个树状数组的节点保存一颗treap,然后就可以查询了。
  好神啊……
  树套树可以方便的进行特殊的区间求和,大多数满足区间加法的运算都可以用树套树来搞,比如这题的对所有第二维坐标小于当前点(相当于一段前缀)求第三维坐标小于当前点的和。= =啊……就是一个特殊的前缀和嘛……
 
  还有就是这题其实有个K的……表示坐标的范围……所以树状数组要一直到k,而不是n
  1. /**************************************************************
  2. Problem: 3262
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:6728 ms
  7. Memory:99128 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 3262
  11. #include<cmath>
  12. #include<vector>
  13. #include<cstdio>
  14. #include<cstring>
  15. #include<cstdlib>
  16. #include<iostream>
  17. #include<algorithm>
  18. #define rep(i,n) for(int i=0;i<n;++i)
  19. #define F(i,j,n) for(int i=j;i<=n;++i)
  20. #define D(i,j,n) for(int i=j;i>=n;--i)
  21. #define pb push_back
  22. #define CC(a,b) memset(a,b,sizeof(a))
  23. using namespace std;
  24. int getint(){
  25. int v=,sign=; char ch=getchar();
  26. while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
  27. while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
  28. return v*sign;
  29. }
  30. const int N=,M=,INF=~0u>>;
  31. const double eps=1e-;
  32. /*******************template********************/
  33. int n,k,tot,l[M],r[M],s[M],rnd[M],w[M],v[M];
  34. #define L l[x]
  35. #define R r[x]
  36. inline void Push_up(int x){ s[x]=s[L]+s[R]+w[x]; }
  37. inline void zig(int &x){int t=L; L=r[t]; r[t]=x; s[t]=s[x]; Push_up(x); x=t;}
  38. inline void zag(int &x){int t=R; R=l[t]; l[t]=x; s[t]=s[x]; Push_up(x); x=t;}
  39. void ins(int &x,int num,int z){
  40. if (!x){
  41. x=++tot; v[x]=num; s[x]=w[x]=z; L=R=; rnd[x]=rand(); return;
  42. }
  43. s[x]+=z;
  44. if (v[x]==num) w[x]+=z;
  45. else if(num<v[x]){
  46. ins(L,num,z); if(rnd[L]<rnd[x]) zig(x);
  47. }else{
  48. ins(R,num,z); if(rnd[R]<rnd[x]) zag(x);
  49. }
  50. }
  51. int rank(int x,int num){
  52. if (!x) return ;
  53. if (v[x]==num) return s[L]+w[x];
  54. else if(num<v[x]) return rank(L,num);
  55. else return s[L]+w[x]+rank(R,num);
  56. }
  57. #undef L
  58. #undef R
  59. /*********************Treap*********************/
  60. int rt[N];
  61. void update(int x,int y,int z){
  62. for(int i=x;i<=k;i+=i&-i) ins(rt[i],y,z);
  63. }
  64. int query(int x,int y){
  65. int ans=;
  66. for(int i=x;i;i-=i&-i) ans+=rank(rt[i],y);
  67. return ans;
  68. }
  69. /*******************Fenwick*********************/
  70. struct data{
  71. int s,c,m;
  72. }a[N];
  73. bool cmp(data a,data b){
  74. if (a.s==b.s){
  75. if (a.c==b.c) return a.m<b.m;
  76. return a.c<b.c;
  77. }
  78. return a.s<b.s;
  79. }
  80. int ans[N];
  81. int main(){
  82. #ifndef ONLINE_JUDGE
  83. freopen("3262.in","r",stdin);
  84. freopen("3262.out","w",stdout);
  85. #endif
  86. n=getint(); k=getint();
  87. F(i,,n){
  88. a[i].s=getint();
  89. a[i].c=getint();
  90. a[i].m=getint();
  91. }
  92. sort(a+,a+n+,cmp);
  93. int num=;
  94. F(i,,n){
  95. if (a[i].s==a[i+].s &&
  96. a[i].c==a[i+].c &&
  97. a[i].m==a[i+].m) num++;
  98. else{
  99. ans[query(a[i].c,a[i].m)+num-]+=num;
  100. update(a[i].c,a[i].m,num);
  101. num=;
  102. }
  103. }
  104. rep(i,n) printf("%d\n",ans[i]);
  105. return ;
  106. }

【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. 【BZOJ】1152: [CTSC2006]歌唱王国Singleland

    题解 读错题了,是最后留下一个牛人首长歌颂他,和其他人没有关系,t就相当于数据组数 结论题,具体可看 https://www.zhihu.com/question/59895916/answer/19 ...

  2. python和mongodb简单交互

    python和mongodb简单交互 1.安装pymongo: pip3 install pymongo 2.pymongo的简单用法: # /usr/bin/env python3 import p ...

  3. sql中循环插入

    #!/bin/sh for i in {1..10}dokdsql sys/kdb<<EOF insert into test values(2) ; EOFdone

  4. 《Android源码设计模式》--单例模式

    No1: 懒汉单例模式优缺点分析 public class Singleton{ private static Singleton instance; private Singleton(){} pu ...

  5. Intellij IDEA Cannot resolve symbol XXX 问题解决办法汇总

    maven项目遇到这类问题基本上是两方面的原因,类对应的依赖没有加载进来.编译器自身的设置和缓存问题. 解决第一类:1.检查项目的pom文件,是否必要的依赖都写清楚了: 2.是否使用自己的私有库,&l ...

  6. HDU - 1027 Ignatius and the Princess II 全排列

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  7. Java工具类- 跨域工具类

    原本Spring MVC项目添加跨域: 在web.xml文件中配置: <!-- cors解决跨域访问问题 --> <filter> <filter-name>cor ...

  8. POJ 3254 & POJ 1185(状压DP入门)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16773   Accepted: 8860 Desc ...

  9. 把eclipse写好的web项目导入idea 部署到Tomcat

    主要分为项目配置和tomcat配置两大步骤. 一.项目配置 打开idea,选择导入项 选择将要打开的项目路径后,继续选择项目的原本类型(后续引导设置会根据原本的项目类型更新成idea的项目),此例中选 ...

  10. [python]缓存函数结果进redis

    工作中遇到一个问题,就是有一些需要对数据库做全表扫描,而且对结果要求比较宽松的地方,总觉得可以找地方优化,比如暂时保存计算结果. 首先想起来的就是functools.lru_cache,但是可惜在py ...