POJ--2104 K-th Number (主席树模版题)
生活随笔
收集整理的這篇文章主要介紹了
POJ--2104 K-th Number (主席树模版题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
求區間第k大
#include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<stdio.h> using namespace std; #define maxn 100009 #define LL long long #define mem(a,b) memset(a,b,sizeof(a)) struct ac{int va,l,r; }tre[maxn*25]; int a[maxn],root[maxn],tot=0; vector<int>q; int getid(int x){return (lower_bound(q.begin(),q.end(),x)-q.begin()+1); } void updata(int l,int r,int &x,int y,int z){tre[++tot]=tre[y];tre[tot].va++;x=tot;if(l==r) return ;int mid=(l+r)/2;if(z>mid){updata(mid+1,r,tre[x].r,tre[y].r,z);}else updata(l,mid,tre[x].l,tre[y].l,z); } int query(int l,int r,int x,int y,int z){if(l==r) return l;int s=tre[tre[x].l].va-tre[tre[y].l].va;int mid=(l+r)/2;if(s>=z){return query(l,mid,tre[x].l,tre[y].l,z);}return query(mid+1,r,tre[x].r,tre[y].r,z-s); } int main(){int n,m;cin>>n>>m;mem(a,0); mem(tre,0);for(int j=1;j<=n;j++){scanf("%d",&a[j]);q.push_back(a[j]);}sort(q.begin(),q.end());q.erase(unique(q.begin(),q.end()),q.end());int len=q.size();for(int j=1;j<=n;j++){int x=getid(a[j]);updata(1,len,root[j],root[j-1],x);}for(int j=0;j<m;j++){int l,r,x;scanf("%d%d%d",&l,&r,&x);cout<<q[query(1,len,root[r],root[l-1],x)-1]<<endl;} }?
轉載于:https://www.cnblogs.com/DyLoder/p/9773364.html
總結
以上是生活随笔為你收集整理的POJ--2104 K-th Number (主席树模版题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kruskal+LCA【p2245】 星
- 下一篇: 硬盘在系统下不能格式化怎么办 系统下无法