题意:
有n个数,q个询问。
询问格式:l r k 区间[l,r]内小于等于k的个数
思路:
离散化加模板即可
参考代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int ls[N],a[N];
int root[N],tot;
int lson[N*20],rson[N*20],sz[N*20];
void update(int last,int cur,int l,int r,int k){
lson[cur]=lson[last];
rson[cur]=rson[last];
sz[cur]=sz[last]+1;
if(l==r)return;
int mid=(l+r)>>1;
if(k<=mid)update(lson[last],lson[cur]=++tot,l,mid,k);
else update(rson[last],rson[cur]=++tot,mid+1,r,k);
}
int query(int last,int cur,int l,int r,int k){
if(k<l)return 0;
if(k>=r){
return sz[cur]-sz[last];
}
int mid=(l+r)>>1;
int sum=0;
sum+=query(lson[last],lson[cur],l,mid,k);
sum+=query(rson[last],rson[cur],mid+1,r,k);
return sum;
}
int main(){
int t;
scanf("%d",&t);
for(int ca=1;ca<=t;ca++){
printf("Case %d:\n",ca);
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ls[i]=a[i];
}
sort(ls+1,ls+1+n);
int sz=unique(ls+1,ls+1+n)-ls-1;
tot=0;
for(int i=1;i<=n;i++){
a[i]=lower_bound(ls+1,ls+1+sz,a[i])-ls;
update(root[i-1],root[i]=++tot,1,sz,a[i]);
}
for(int i=1;i<=q;i++){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);l++,r++;
printf("%d\n",query(root[l-1],root[r],1,sz,upper_bound(ls+1,ls+1+sz,k)-ls-1));
}
}
return 0;
}