前言:
这题假如用树状数组的话,还是很不错的一个题的.
思路:
直接把两个序列都按权值排序,把查询的以及原序列,这样做的好处就是保证我插入的一定是合法的,然后直接查询即可.
代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+50;
struct Query{
int l,r,k,id,ans;//询问区间[l,r]小于等于k的个数.存下查询时间轴以及答案.
}q[N],w[N];
int n,m,c[N];
int lowbit(int x) { return x&(-x); }
void add(int u,int x)
{
while(u<=n)
{
c[u]+=x;
u+=lowbit(u);
}
}
int ask(int u)
{
int res=0;
while(u)
{
res+=c[u];
u-=lowbit(u);
}return res;
}
bool cmp(Query A,Query B)
{
return A.id<B.id;
}
bool cnp(Query A,Query B)
{
return A.k<B.k;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i].k);
w[i].id=i;
}sort(w+1,w+1+n,cnp);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
q[i].id=i;
}sort(q+1,q+1+m,cnp);int id=1;
for(int i=1;i<=m;i++)
{
while(w[id].k<=q[i].k&&id<=n) add(w[id].id,1),id++;
q[q[i].id].ans=ask(q[i].r)-ask(q[i].l-1);
}sort(q+1,q+1+m,cmp);
for(int i=1;i<=m;i++) printf("%d\n",q[i].ans);
return 0;
}
京公网安备 11010502036488号