VIJOS 校门外的树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960603/article/details/82765648

题目传送门
每个询问其实是求前面有多少个区间与之相交
答案就是:前面区间数量-与前面区间不相交数量
与前面区间不相交数量=前面区间 l 大于询问 r 的数量 + 前面区间 r 小于询问 l 的数量
代码:

#include<cstdio>
using namespace std;

#define low(x) (x&(-x))
const int maxn=50000+100;

int treel[maxn],treer[maxn];
int n,m;

void Add(int *tree,int x){
	while(x<=n){
		tree[x]++;
		x+=low(x); 
	}
}

int GetSum(int *tree,int x){
	int sum=0;
	while(x){
		sum+=tree[x];
		x-=low(x);
	}
	return sum;
}

int main(){
	
	scanf("%d%d",&n,&m);
	int type,l,r;
	int typeonenum=0;
	for(int i=1;i<=m;i++){
	    scanf("%d%d%d",&type,&l,&r);
		if(type==2) printf("%d\n",typeonenum-GetSum(treel,n)+GetSum(treel,r)-GetSum(treer,l-1));
		if(type==2) continue;
		else typeonenum++;
		Add(treel,l);
		Add(treer,r);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/82765648
今日推荐