注意判断 三个条件都一样的……
(CDQ分治 其实并不是很难理解 只是想不到……)

CDQ分治:

//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 888888
int n,k,tree[N],tot,ans[N];
struct Node{int a,b,c,ans,sum;}node[N];
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;}
bool cmp2(Node a,Node b){return a.b<b.b;}
void insert(int l,int r,int pos,int num,int wei){if(l==r){tree[pos]+=wei;return;}int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid>=num)insert(l,mid,lson,num,wei);else insert(mid+1,r,rson,num,wei);tree[pos]=tree[lson]+tree[rson];
}
int query(int l,int r,int pos,int num){if(r<=num)return tree[pos];int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid>=num)return query(l,mid,lson,num);else return query(l,mid,lson,num)+query(mid+1,r,rson,num);
}
void cdq(int l,int r){if(l==r)return;int mid=(l+r)>>1,jy=l;cdq(l,mid),cdq(mid+1,r);sort(node+l,node+mid+1,cmp2),sort(node+mid+1,node+r+1,cmp2);for(int i=mid+1;i<=r;i++){while(jy<=mid&&node[jy].b<=node[i].b)insert(1,k,1,node[jy].c,node[jy].sum),jy++;node[i].ans+=query(1,k,1,node[i].c);}while(jy-->l)insert(1,k,1,node[jy].c,-node[jy].sum);
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;node[i].sum=1,i++)scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].c);sort(node+1,node+1+n,cmp);for(int i=1;i<=n;i++)if(node[i].a!=node[tot].a||node[i].b!=node[tot].b||node[i].c!=node[tot].c)node[++tot]=node[i];else node[tot].sum++;cdq(1,tot);for(int i=1;i<=tot;i++)ans[node[i].ans+node[i].sum-1]+=node[i].sum;for(int i=0;i<n;i++)printf("%d\n",ans[i]);
}

树套树 (线段树+treap):

//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 6005000
int n,k,root[N],size,t,ans,rec,Ans[1000500];
struct Node{int s,c,m;}node[1000500];
struct Tree{int ch[2],v,cnt,rnd,sz;}tr[N];
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;}
void Upd(int k){tr[k].sz=tr[k].cnt+tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz;}
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;}
void ins(int &k,int num){if(!k){k=++size;tr[k].cnt=tr[k].sz=1,tr[k].rnd=rand(),tr[k].v=num;return;}tr[k].sz++;if(tr[k].v==num){tr[k].cnt++;return;}bool f=num>tr[k].v;ins(tr[k].ch[f],num);if(tr[k].rnd>tr[tr[k].ch[f]].rnd)rot(k,f);
}
void ask(int &k,int num){if(!k)return;if(tr[k].v==num){ans+=tr[k].cnt+tr[tr[k].ch[0]].sz; return;}else if(tr[k].v>num)ask(tr[k].ch[0],num);else ans+=tr[k].cnt+tr[tr[k].ch[0]].sz,ask(tr[k].ch[1],num);
}
void Insert(int l,int r,int pos){ins(root[pos],node[t].m);if(l==r)return;int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid<node[t].c)Insert(mid+1,r,rson);else Insert(l,mid,lson);
}
void Query(int l,int r,int pos){if(r<=node[t].c){ask(root[pos],node[t].m);return;}int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;if(mid>=node[t].c)Query(l,mid,lson);else Query(l,mid,lson),Query(mid+1,r,rson);
}
int main(){scanf("%d%d",&n,&k);for(int i=1;i<=n;i++)scanf("%d%d%d",&node[i].s,&node[i].c,&node[i].m);sort(node+1,node+1+n,cmp);for(t=1;t<=n;t++){if(node[t].c!=node[t+1].c||node[t].m!=node[t+1].m||node[t].s!=node[t+1].s)ans=0,Query(1,k,1),Ans[ans]+=rec+1,Insert(1,k,1),rec=0;else rec++,Insert(1,k,1);}for(int i=0;i<n;i++)printf("%d\n",Ans[i]);
}

转载于:https://www.cnblogs.com/SiriusRen/p/6532149.html

BZOJ 3262 cdq分治 OR 树套树相关推荐

  1. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  2. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  3. 【BZOJ3196】【Tyvj1730】二逼平衡树,第一次的树套树(线段树+splay)

    传送门1 传送门2 写在前面:创造迄今最长的正常代码的记录 思路:个人感觉这个树套树就是对线段树的每个区间建一棵splay来维护,最初觉得这个方法会爆T爆M--(实际上真的可能会爆).对于5个操作,我 ...

  4. 数据结构:树套树-替罪羊树套权值线段树

    BZOJ3065 本题是在BZOJ上的处女A,实在不应该拿这样一道题来开头 平衡树套线段树应该是树套树问题里比较难的一种了,当然我记得还有一个替罪羊树套Trie树的题,我是不信自己能写出来的. 外层的 ...

  5. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  6. Uva 3767 Dynamic len(set(a[L:R])) 树套树

    Dynamic len(set(a[L:R])) Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 https://uva.onlinejudge.org/in ...

  7. 【Luogu】P3380树套树模板(线段树套Splay)

    题目链接 幸甚至哉,歌以咏志. 拿下了曾经是那么遥不可及的线段树,学会了曾经高不可攀的平衡树,弄懂了装B的时候才挂在嘴边的树套树. 每道模板都是链上的一颗珠子.把它们挨个串起来,就成为我成长的历程. ...

  8. #4604. The kth maximum number(整体二分 + 树套树)

    #4604. The kth maximum number 给定一个大小不超过5×1055 \times 10 ^ 55×105的矩形区域,有一些点有点权. 每次询问给定x1,y1,x2,y2,kx_ ...

  9. [树套树] 网络管理

    A:[CTSC2008]网络管理 此题本来是平衡树板块的,但俺写的是树套树,平衡树会多个log 题目 查询第kkk大,天然主席树可以维护 就不用了平衡树二分,多个logloglog了 将树上(u,v) ...

最新文章

  1. 转:一个简单的基于WEB的QTP自动化测试框架-SAFFRON
  2. python做一个系统-用python做一个系统监控程序
  3. 寒羽对帝国的理解(通向高手之路)(转)
  4. 有道云笔记Windows桌面版v6.5.0.0去左下角广告方法
  5. 查看Scala编译的.class文件
  6. 最简单的jQuery程序
  7. ei eo eq什么意思_招生官看重的EI和CPCI到底是啥?
  8. 使用BULK COLLECT+FORALL加速批量提交
  9. 【实验记录】Fashion-Mnist分类实验记录
  10. 如果一个人请优雅的活着。
  11. 大数据在智慧城市中的应用有哪些
  12. Improving Opencv 8: The Core Functionality :File Input and Output using XML and YAML files
  13. 粒子群优化算法(PSO)附代码
  14. SEO必备工具之Xenu(绿蜗牛)网站死链接检测
  15. python美团外卖_美团外卖不满意分析_Python和Excel
  16. ie浏览器html状态栏隐藏,我的IE浏览器忽然上面的菜单栏及地址栏都不见了
  17. 笔记本电脑频繁假死的一个解决办法
  18. [无线玩家]玩转无线路由之DD-WRT基础扫盲
  19. Oracle11安装教程
  20. Matlab基于颜色的车牌识别

热门文章

  1. python opencv图像对比度增强_图像增强、锐化, Python-OpenCV 来实现 4 种方法!
  2. centos 一键安装ftp 配置_CentOS快速搭建FTP(初级-四步)
  3. 高考与机器学习训练测试
  4. 全球及中国磁性分离滑轮行业竞争战略及未来产销需求预测报告2022版
  5. 随机数排列JAVA_随机数生成器,按排序顺序
  6. 三巨头垄断全球农业-丰收节贸易会:世界最大种子农药公司
  7. 铁乐学Python_day12_作业
  8. BZOJ 3156: 防御准备( dp + 斜率优化 )
  9. php多进程实现 亲测
  10. 【并查集】 HDU 4424 Conquer a New Region 贪心