主席树(可持久化线段树)学习笔记
2015-12-20 09:45
267 查看
首先离散化 然后当前版本的线段树可以有上个版本的线段树修改lgn个节点得到的
还满足区间减法
好神
还满足区间减法
好神
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<set> using namespace std; set<int>D; char c; bool flag; inline void read(int&a) {a=0,flag=false;do c=getchar();while(c!='-'&&(c<'0'||c>'9'));if(c=='-')c=getchar(),flag=true;while(c<='9'&&c>='0')a=(a<<3)+(a<<1)+c-'0',c=getchar();if(flag)a=-a;} struct Node { Node *lc,*rc; int l,r,sum; }*Segement_Root[10001]; struct O {int x,z;}Line[100001]; int data[100001]; int Sorted_data[1000001]; Node*build(int l,int r) { Node*tp=new Node; tp->lc=NULL; tp->rc=NULL; tp->l=l; tp->r=r; tp->sum=0; if(l^r)tp->lc=build(l,(l+r)>>1),tp->rc=build(((l+r)>>1)+1,r); return tp; } Node *add(Node *last,int l,int r,int data) { if(l^r) { Node *tp=new Node; *tp=*last; if(data<=Sorted_data[(l+r)>>1]) tp->lc=add(last->lc,l,(l+r)>>1,data); else tp->rc=add(last->rc,((l+r)>>1)+1,r,data); tp->sum++; return tp; } else { Node *tp; tp=new Node; *tp=*last; tp->sum++; return tp; } } int K_th(Node *rr,Node *lr,int l,int r,int k) { if(l^r) { if(rr->lc->sum-lr->lc->sum>=k) return K_th(rr->lc,lr->lc,l,(l+r)>>1,k); return K_th(rr->rc,lr->rc,((l+r)>>1)+1,r,k-rr->lc->sum+lr->lc->sum); } else return Sorted_data[l]; } int main() { int n,m; read(n); read(m); for(int i=1;i<=n;i++) read(data[i]),D.insert(data[i]); set<int>::iterator tp; int con; for(tp=D.begin();tp!=D.end();tp++) Sorted_data[++con]=*tp; Segement_Root[0]=build(1,con); for(int i=1;i<=n;i++) Segement_Root[i]=add(Segement_Root[i-1],1,con,data[i]); int l,r,k; while(m--) { read(l),read(r),read(k); printf("%d\n",K_th(Segement_Root[r],Segement_Root[l-1],1,con,k)); } return 0; }
相关文章推荐
- online_judge_1111
- 深入分析JavaWeb Item27 -- JDBC学习入门
- Vxworks for PowerPC安装步骤
- 双基回文数
- Java反射机制
- 基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
- BIEE11g BI_server Jvm參数调整
- 常见文件系统 系统函数 http://www.nowcoder.com/profile/380772/test/2198787/25355?onlyWrong=0
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(六)地图搜索模块
- Hibernate 学习代码/笔记 (一)
- cas
- 大话设计模式-简单工厂模式
- 怎样在C++中获得完整的类型名称
- Mac配置Qt环境——Could not resolve SDK path for 'macosx10.8'
- 删除表(数据)
- insert mode and logging
- Xcode常见警告和错误
- Linux whoami 命令
- STM32 RTT LCD
- UVa1658 Admiral(拆点法+最小费用流)