换个角度思考-----------------------------思维(离线+树状数组)

换个角度思考-----------------------------思维(离线+树状数组)_第1张图片

换个角度思考-----------------------------思维(离线+树状数组)_第2张图片

解析:
对于询问先离线处理,然后对于询问按照x从小到大排序。对于序列的数也要从小到大排序。
对于每次询问,如果ai<=x 就让树状数组i位置上+1,然后区间查询即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10000;
int c[N];
int n,q;
int ans[N];
struct node
{
	int l,r,x,pos;
	bool operator< (const node &W){
		return x<W.x;
	}
}a[N],res[N];

int lowbit(int x)
{
	return x&(-x);
}
void add(int i,int x)
{
	while(i<N)
	{
		c[i]+=x;
		i+=lowbit(i);
	 } 
}
int sum(int i)
{
	int res=0;
	while(i)
	{
		res+=c[i];
		i-=lowbit(i);
	}
	return res;
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>res[i].x,res[i].pos=i;
	sort(res+1,res+1+n);
	for(int i=1;i<=q;i++) cin>>a[i].l>>a[i].r>>a[i].x,a[i].pos=i;
	sort(a+1,a+1+q);
	for(int i=1,j=1;i<=q;i++)
	{
		while(res[j].x<=a[i].x&&j<=n)
		{
			add(res[j].pos,1);
			++j;
		}
		ans[a[i].pos]=sum(a[i].r)-sum(a[i].l-1);
	}
	for(int i=1;i<=q;i++) cout<<ans[i]<<endl;

	
}

你可能感兴趣的:(思维,树状数组)