注意判断 三个条件都一样的……

(CDQ分治 其实并不是很难理解 只是想不到……)

CDQ分治:

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 888888
  6. int n,k,tree[N],tot,ans[N];
  7. struct Node{int a,b,c,ans,sum;}node[N];
  8. bool cmp(Node a,Node b){if(a.a!=b.a)return a.a<b.a;if(a.b!=b.b)return a.b<b.b;return a.c<b.c;}
  9. bool cmp2(Node a,Node b){return a.b<b.b;}
  10. void insert(int l,int r,int pos,int num,int wei){
  11. if(l==r){tree[pos]+=wei;return;}
  12. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  13. if(mid>=num)insert(l,mid,lson,num,wei);
  14. else insert(mid+1,r,rson,num,wei);
  15. tree[pos]=tree[lson]+tree[rson];
  16. }
  17. int query(int l,int r,int pos,int num){
  18. if(r<=num)return tree[pos];
  19. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  20. if(mid>=num)return query(l,mid,lson,num);
  21. else return query(l,mid,lson,num)+query(mid+1,r,rson,num);
  22. }
  23. void cdq(int l,int r){
  24. if(l==r)return;
  25. int mid=(l+r)>>1,jy=l;
  26. cdq(l,mid),cdq(mid+1,r);
  27. sort(node+l,node+mid+1,cmp2),sort(node+mid+1,node+r+1,cmp2);
  28. for(int i=mid+1;i<=r;i++){
  29. while(jy<=mid&&node[jy].b<=node[i].b)insert(1,k,1,node[jy].c,node[jy].sum),jy++;
  30. node[i].ans+=query(1,k,1,node[i].c);
  31. }
  32. while(jy-->l)insert(1,k,1,node[jy].c,-node[jy].sum);
  33. }
  34. int main(){
  35. scanf("%d%d",&n,&k);
  36. for(int i=1;i<=n;node[i].sum=1,i++)scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].c);
  37. sort(node+1,node+1+n,cmp);
  38. for(int i=1;i<=n;i++)
  39. if(node[i].a!=node[tot].a||node[i].b!=node[tot].b||node[i].c!=node[tot].c)node[++tot]=node[i];
  40. else node[tot].sum++;
  41. cdq(1,tot);
  42. for(int i=1;i<=tot;i++)ans[node[i].ans+node[i].sum-1]+=node[i].sum;
  43. for(int i=0;i<n;i++)printf("%d\n",ans[i]);
  44. }

树套树 (线段树+treap):

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 6005000
  7. int n,k,root[N],size,t,ans,rec,Ans[1000500];
  8. struct Node{int s,c,m;}node[1000500];
  9. struct Tree{int ch[2],v,cnt,rnd,sz;}tr[N];
  10. bool cmp(Node a,Node b){if(a.s!=b.s)return a.s<b.s;if(a.c!=b.c)return a.c<b.c;return a.m<b.m;}
  11. void Upd(int k){tr[k].sz=tr[k].cnt+tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz;}
  12. void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
  13. void ins(int &k,int num){
  14. if(!k){k=++size;tr[k].cnt=tr[k].sz=1,tr[k].rnd=rand(),tr[k].v=num;return;}
  15. tr[k].sz++;
  16. if(tr[k].v==num){tr[k].cnt++;return;}
  17. bool f=num>tr[k].v;ins(tr[k].ch[f],num);
  18. if(tr[k].rnd>tr[tr[k].ch[f]].rnd)rot(k,f);
  19. }
  20. void ask(int &k,int num){
  21. if(!k)return;
  22. if(tr[k].v==num){ans+=tr[k].cnt+tr[tr[k].ch[0]].sz; return;}
  23. else if(tr[k].v>num)ask(tr[k].ch[0],num);
  24. else ans+=tr[k].cnt+tr[tr[k].ch[0]].sz,ask(tr[k].ch[1],num);
  25. }
  26. void Insert(int l,int r,int pos){
  27. ins(root[pos],node[t].m);
  28. if(l==r)return;
  29. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  30. if(mid<node[t].c)Insert(mid+1,r,rson);
  31. else Insert(l,mid,lson);
  32. }
  33. void Query(int l,int r,int pos){
  34. if(r<=node[t].c){ask(root[pos],node[t].m);return;}
  35. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  36. if(mid>=node[t].c)Query(l,mid,lson);
  37. else Query(l,mid,lson),Query(mid+1,r,rson);
  38. }
  39. int main(){
  40. scanf("%d%d",&n,&k);
  41. for(int i=1;i<=n;i++)
  42. scanf("%d%d%d",&node[i].s,&node[i].c,&node[i].m);
  43. sort(node+1,node+1+n,cmp);
  44. for(t=1;t<=n;t++){
  45. if(node[t].c!=node[t+1].c||node[t].m!=node[t+1].m||node[t].s!=node[t+1].s)
  46. ans=0,Query(1,k,1),Ans[ans]+=rec+1,Insert(1,k,1),rec=0;
  47. else rec++,Insert(1,k,1);
  48. }
  49. for(int i=0;i<n;i++)printf("%d\n",Ans[i]);
  50. }

BZOJ 3262 cdq分治 OR 树套树的更多相关文章

  1. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  2. bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  3. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  4. bzoj3110: [Zjoi2013]K大数查询 【cdq分治&树套树】

    模板题,折腾了许久. cqd分治整体二分,感觉像是把询问分到答案上. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = ...

  5. [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...

  6. Codechef-ANCESTOR(树套树/CDQ分治)

    题意: 给定两棵有根树,各有 N 个点.两棵树上的点分别被从 1 到 N 标号.两棵树的根均为标号为 1 的节点. 你的任务非常简单:对于每个 i,找到一个 j(j != i),使得在两棵树中 j 都 ...

  7. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  8. [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)

    题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...

  9. 【APIO2019】路灯(ODT & (树套树 | CDQ分治))

    Description 一条 \(n\) 条边,\(n+1\) 个点的链,边有黑有白.若结点 \(a\) 可以到达 \(b\),需要满足 \(a\to b\) 的路径上的边不能有黑的.现给出 \(0\ ...

随机推荐

  1. codevs 1288 埃及分数 (迭代加深搜索)

    题目大意:给你一个分数$a/b$,把它拆解成$\sum_{i=1}^{n}1/ai$的形式,必须保证$ai$互不相同的情况下,尽量保证n最小,其次保证分母最大的分数的分母最小 什么鬼玄学题!!! 因为 ...

  2. 是否可以从一个static方法内部发出对非static方法的调用

    不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方 法调用,而static方法调用时不需要创建对象,可以直接调用.也就是说,当一个static方法被调用时 ...

  3. chrome默认打开隐身模式

    chrome图标右键属性,在“目标”后添加参数“ --incognito”(注意是双短划线,不包括双引号,双短划线前加一空格)就可以直接以隐身模式启动chrome了

  4. Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单

    本文来自肥宝传说之路,引用必须注明出处! 这章憋了好久.本来想写选项卡的,学到TabHost,TabWidget的,把代码拿过来准备研究的时候,发现竟然在4.0.3版本号被废弃了. 百度一下,发如今后 ...

  5. matplotlib 可视化 —— 绘制常见图形

    0. 饼状图 plt.pie():Python数据可视化:饼状图 1. 三角形 描点连线,起点和终点相同 triangle1 = ((0, sqrt(3)/2), (1, 3*sqrt(3)/2), ...

  6. 34.angularJS的{{}}和ng-bind

    转自:https://www.cnblogs.com/best/tag/Angular/ 1. <html> <head> <meta charset="utf ...

  7. [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...

  8. Oracle 常用内置函数

    --绝对值 ) --求模 ,) --取整 --四舍五入 )from dual;--123.5 ) --截取 )from dual;--123.4 ) --字符串长度 --截取 select st.sn ...

  9. .NET与JAVA RSA密钥格式转换

    一.该篇内容用于记录.net和Java之间,RSA公密钥的转换 using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Asn1.X509; ...

  10. 自动关闭Messbox

    /// <summary> /// 自动关闭Messbox /// </summary> public class MessageBoxAutoClose { System.T ...