【POJ】【P2104&P2761】【题解】【区间K大】【主席树】
来源:互联网 发布:c高级编程第8版 中文 编辑:程序博客网 时间:2024/06/11 05:18
传送门:
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;}elsey=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;}elsey=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;}
0 0
- 【POJ】【P2104&P2761】【题解】【区间K大】【主席树】
- poj 2104 区间第k大 主席树
- poj 2104 主席树(区间第k大)
- poj2104区间K大 主席树
- poj2104 主席树区间第k大
- 主席树解决区间第k大
- 区间第k大(主席树)
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number 主席树 静态区间第K大
- 【POJ 2104】(K-th Number-区间第k大-主席树)
- POJ 2104 K-th Number (主席树 静态区间第K大)
- poj 2104 K-th Number (静态区间第k大,主席树)
- [poj 2104 K-th Number] 主席树 区间第K大
- POJ 2104 K-th Number 静态区间第k大 主席树
- POJ 2104 K-th Number 主席树(求区间第k大)
- poj 2107 K-th Number(主席树求区间第K大)
- 【主席树 求区间第k大】poj 2104 K-th Number
- 异常: Incorrect result size: expected 1, actual 0
- ViewPager
- [OpenGL]OpenGL库函数汇总
- oracle 9i/10g安装包和PATCH下载地址汇总
- UVaOJ 414 - Machined Surfaces
- 【POJ】【P2104&P2761】【题解】【区间K大】【主席树】
- 自然连接
- Android使用ant对项目进行编译签名优化打包
- 摩托罗拉悄然变革:智能手表或决定未来发展
- Html form提交
- String & StringBuffer的比较
- android 单元测试
- 运用css3 实现骰子3d旋转效果
- 关于android Project运行中出错Error executing aapt: Return code -1073741819