题意:
求区间第k大的数是哪个
看了卿姐的的视频学会了主席树
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=2e5+6;
int n,m,cnt,root[maxn],a[maxn];
struct node{
int l,r,sum;
}T[maxn*40];
vector<int>v;
int getid(int x){
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
void update(int l,int r,int &cur,int pre,int pos){
// cout<<l<<" "<<r<<" "<<cur<<" "<<pre<<endl;
T[++cnt]=T[pre];
T[cnt].sum++;
cur=cnt;
// cout<<cur<<endl;
if(l==r)return;
int mid=(l+r)/2;
if(pos<=mid)update(l,mid,T[cur].l,T[pre].l,pos);
else update(mid+1,r,T[cur].r,T[pre].r,pos);
}
int query(int l,int r,int x,int y,int k){
if(l==r)return l;
int mid=(l+r)/2;
int sum=T[T[y].l].sum-T[T[x].l].sum;
if(k<=sum)return query(l,mid,T[x].l,T[y].l,k);
else return query(mid+1,r,T[x].r,T[y].r,k-sum);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
v.push_back(a[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
for(int i=1;i<=n;i++){
update(1,n,root[i],root[i-1],getid(a[i]));
// cout<<root[i]<<" "<<root[i-1]<<endl;
// cout<<endl;
}
int x,y,k;
for(int i=1;i<=m;i++){
cin>>x>>y>>k;
cout<<v[query(1,n,root[x-1],root[y],k)-1]<<endl;
}
return 0;
}
HDU-4417
题意:
区间排名查询
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int maxx=1e5+6;
int cnt=0;
struct node{
int l,r,sum;
}t[maxx*50];
int a[maxx],root[maxx];
vector<int>v;
int getid(int x){
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
void update(int l,int r,int &cur,int pre,int k){
t[++cnt]=t[pre];
t[cnt].sum++;
cur=cnt;
if(l==r)return;
int mid=(l+r)>>1;
if(k<=mid)update(l,mid,t[cur].l,t[pre].l,k);
else update(mid+1,r,t[cur].r,t[pre].r,k);
}
int query(int l,int r,int x,int y,int k){
int sum=t[y].sum-t[x].sum;
if(r<=k) {
return sum;
}
if(k<l)return 0;
int mid=(l+r)>>1;
if(k<=mid) return query(l,mid,t[x].l,t[y].l,k);
else return t[t[y].l].sum-t[t[x].l].sum+query(mid+1,r,t[x].r,t[y].r,k);
}
int main(){
int T;cin>>T;
int flag=1;
while(T--){
v.clear();
cout<<"Case "<<flag++<<":"<<endl;
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
v.push_back(a[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
// for(int i=0;i<v.size();i++){
// cout<<v[i]<<endl;
// }
// cout<<endl;
for(int i=1;i<=n;i++){
update(1,n,root[i],root[i-1],getid(a[i]));
// cout<<t[root[i]].sum<<endl;
}
// cout<<endl;
for(int i=0;i<m;i++){
int l,r,k;cin>>l>>r>>k;
l++;r++;
k=upper_bound(v.begin(),v.end(),k)-v.begin();
cout<<query(1,n,root[l-1],root[r],k)<<endl;
}
}
}