【POJ】【P2104&P2761】【题解】【区间K大】【主席树】
2014-05-04 10:22
211 查看
传送门:
http://poj.org/problem?id=2104
http://poj.org/problem?id=2761
裸主席树……
Code:
新模版:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
inline int lowbit(int x){
return x&(-x);
}
struct node{
int size;
node *c[2];
node();
void rz(){
size=c[0]->size+c[1]->size;
}
}*Null=new node(),*root[maxn];
node poor[maxn<<4];
int tot;
node::node(){
size=0;
c[0]=c[1]=Null;
}
int a[maxn],b[maxn];
void insert(node *&y,node *&x,int l,int r,int t){
//if(x==NULL)x=Null;
if(tot<(maxn<<4)){
y=&poor[tot++];
y->size=0;y->c[0]=y->c[1]=Null;
}else y=new node();
if(l==r){
*y=*x;y->size++;return;
}
int mid=(l+r)>>1;
if(t<=b[mid]){
insert(y->c[0],x->c[0],l,mid,t);
y->c[1]=x->c[1];
y->rz();
}else{
insert(y->c[1],x->c[1],mid+1,r,t);
y->c[0]=x->c[0];
y->rz();
}
}
int kth(node *&x,node *&y,int l,int r,int k){
if(l==r)return b[l];
int mid=(l+r)>>1;
int R=y->c[0]->size-x->c[0]->size;
if(R>=k)return kth(x->c[0],y->c[0],l,mid,k);
else return kth(x->c[1],y->c[1],mid+1,r,k-R);
}
int n,m,size;
int main(){
Null->size=0;
Null->c[0]=Null->c[1]=Null;
scanf("%d%d",&n,&m);
root[0]=Null;
for(int i=1;i<=n;i++){
root[i]=Null;
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
size=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
insert(root[i],root[i-1],1,size,a[i]);
while(m--){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",kth(root[l-1],root[r],1,size,k));
}
return 0;
}
http://poj.org/problem?id=2104
http://poj.org/problem?id=2761
裸主席树……
Code:
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int maxn=1e5+10; int a[maxn],b[maxn]; struct node{ int size; node *c[2]; node(){ c[0]=c[1]=NULL;size=0; } void rz(){ if(c[0])size+=c[0]->size; if(c[1])size+=c[1]->size; } }*Null=new node(),*root[maxn]={NULL}; int tot; node poor[maxn<<4]; void insert(node *&y,node *&x,int l,int r,int t){ if(x==NULL)x=Null; if(tot<(maxn<<4)){ y=&poor[tot++]; y->c[0]=y->c[1]=Null; y->size=0; }else y=new node(); int mid=(l+r)>>1; if(l==r){ *y=*x; y->size++; return; } if(t<=b[mid]){ insert(y->c[0],x->c[0],l,mid,t); y->c[1]=x->c[1]; y->rz(); }else{ insert(y->c[1],x->c[1],mid+1,r,t); y->c[0]=x->c[0]; y->rz(); } } int kth(node *&x,node *&y,int l,int r,int k){ if(x==NULL)x=Null; if(y==NULL)y=Null; if(l==r)return b[l]; int mid=(l+r)>>1; int R=0; if(y->c[0])R+=y->c[0]->size; if(x->c[0])R-=x->c[0]->size; if(R>=k)return kth(x->c[0],y->c[0],l,mid,k); else return kth(x->c[1],y->c[1],mid+1,r,k-R); } int n,m,size; int main(){ Null->c[0]=Null->c[1]=Null; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]; } sort(b+1,b+1+n); size=unique(b+1,b+1+n)-b-1; for(int i=1;i<=n;i++) insert(root[i],root[i-1],1,size,a[i]); while(m--){ int l,r,k; scanf("%d%d%d",&l,&r,&k); printf("%d\n",kth(root[l-1],root[r],1,size,k)); } return 0; }
新模版:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
inline int lowbit(int x){
return x&(-x);
}
struct node{
int size;
node *c[2];
node();
void rz(){
size=c[0]->size+c[1]->size;
}
}*Null=new node(),*root[maxn];
node poor[maxn<<4];
int tot;
node::node(){
size=0;
c[0]=c[1]=Null;
}
int a[maxn],b[maxn];
void insert(node *&y,node *&x,int l,int r,int t){
//if(x==NULL)x=Null;
if(tot<(maxn<<4)){
y=&poor[tot++];
y->size=0;y->c[0]=y->c[1]=Null;
}else y=new node();
if(l==r){
*y=*x;y->size++;return;
}
int mid=(l+r)>>1;
if(t<=b[mid]){
insert(y->c[0],x->c[0],l,mid,t);
y->c[1]=x->c[1];
y->rz();
}else{
insert(y->c[1],x->c[1],mid+1,r,t);
y->c[0]=x->c[0];
y->rz();
}
}
int kth(node *&x,node *&y,int l,int r,int k){
if(l==r)return b[l];
int mid=(l+r)>>1;
int R=y->c[0]->size-x->c[0]->size;
if(R>=k)return kth(x->c[0],y->c[0],l,mid,k);
else return kth(x->c[1],y->c[1],mid+1,r,k-R);
}
int n,m,size;
int main(){
Null->size=0;
Null->c[0]=Null->c[1]=Null;
scanf("%d%d",&n,&m);
root[0]=Null;
for(int i=1;i<=n;i++){
root[i]=Null;
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
size=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++)
insert(root[i],root[i-1],1,size,a[i]);
while(m--){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",kth(root[l-1],root[r],1,size,k));
}
return 0;
}
相关文章推荐
- POJ 2104 K-th Number (主席树 静态区间第K大)
- POJ 2104 【主席树】【区间第K大】
- 【主席树 求区间第k大】poj 2104 K-th Number
- poj 2104 K-th Number (静态区间第k大,主席树)
- poj2104区间K大 主席树
- [poj 2104 K-th Number] 主席树 区间第K大
- POJ 2104 && POJ 2761 (静态区间第k大,主席树)
- poj2104 K-th Number(静态区间k大,主席树)
- POJ 2104 K-th Number 主席树 区间第K大
- POJ-2104 K-th Number (主席树 不带修改区间第k大)
- 4000 【POJ - 2761】Feed the dogs 【主席树 求静态区间第k大】
- 【POJ 2104】(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number 主席树(求区间第k大)
- 【POJ - 2104】K-th Number 【主席树 求静态区间第k大】
- poj 2104 主席树(区间第k大)
- 可持久化线段树|主席树 POJ 2104 区间第k大的数
- poj 2104 主席树(区间第k大)
- ★Uva 1626 && POJ 1141 Brackets sequence 详细题解(区间DP+递归打印)
- 主席树经典题目 区间k大值 poj2104
- POJ 2761 Feed the dogs 主席树(区间第k大)