主席树入门+模板 POJ 2104
来源:互联网 发布:闪电地震流数据 编辑:程序博客网 时间:2024/05/21 01:57
查询区间第K大,而且没有修改。
主席树的原理就是在现有的一颗线段树上不断加入新的节点,而加入的对于现有线段树的影响另开一条链记录下来,这样我们就可以保存线段树的历史版本,在查询时只需要把区间减一下就可以了。
#include <vector>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 1e5+7;vector<int>q;int a[maxn],root[maxn],cnt=0;struct node{int l,r,sum;}T[maxn*20];int getid(int x){return lower_bound(q.begin(),q.end(),x)-q.begin()+1;}void update(int l,int r,int x,int &y,int pos){ T[++cnt]=T[x];T[cnt].sum++;y=cnt; //开辟新的链 if(l==r) return ; int m = (l+r)>>1; if(m>=pos) update(l,m,T[x].l,T[y].l,pos);//修改新开辟的链 else update(m+1,r,T[x].r,T[y].r,pos);}int query(int l,int r,int x,int y,int k){ if(l==r) return l; int m = (l+r)>>1; int sum = T[T[y].l].sum-T[T[x].l].sum; if(sum>=k) query(l,m,T[x].l,T[y].l,k); else query(m+1,r,T[x].r,T[y].r,k-sum);}int main(){ int i,n,m,k,x,y; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) scanf("%d",a+i),q.push_back(a[i]); sort(q.begin(),q.end());q.erase(unique(q.begin(),q.end()),q.end()); for(i=1;i<=n;i++) update(1,n,root[i-1],root[i],getid(a[i])); for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&k); printf("%d\n",q[query(1,n,root[x-1],root[y],k)-1]); } return 0;}
0 0
- 主席树入门+模板 POJ 2104
- POJ 2104 K-th Number 主席树模板题
- POJ 2104 K-th Number(模板主席树)
- poj 2104 K-th Number (主席树模板)
- poj 2104 主席树
- POJ 2104 主席树
- poj 2104 区间第K小 主席树入门题
- 【poj 2104】K-th Number 主席树入门
- 【POJ 2104】K-th Number 【主席树入门题】
- POJ 2104 K-th Number [主席树入门]【数据结构】
- POJ 2104 K-th Number(主席树入门)
- poj-2104(主席树)
- poj 2104 (主席树)
- POJ 2104(主席树)
- poj 2104(主席树)
- poj 2104 主席树 板子
- POJ-2104(主席树)
- POJ 2104 (主席树)
- Java设计模式之策略设计模式
- git的学习笔记(与小伙伴协作)
- 使用uc/os中遇到的一个有关OSMboxPend()的一个问题
- java-web易错汇总
- 2012年第三届蓝桥杯C/C++程序设计本科B组决赛
- 主席树入门+模板 POJ 2104
- Java获取WEB目录路径
- ViewPager三个步骤
- bzoj3295【CQOI2011】动态逆序对
- MyBatis主流程分析之(二)-打开会话和数据库操作
- 第十二周—阅读程序(4)
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- HDU 2106 decimal system(进制转换+模拟)
- DataRow[]绑定到datalist gatagrid repeater数据控件