洛谷 P2184 贪婪大陆(树状数组)

传送门


解题思路

一直往扫描线方面想,结果自己没想出来,还是运用的不够灵活。
其实很简单,对于查询区间[l,r],答案为左端点小于等于r的区间数-右端点小于l的区间数。
维护两个树状数组即可。

AC代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
int n,m,d[3][maxn];
inline int lowbit(int x){
	return x&(-x);
}
inline void update(int id,int x){
	for(int i=x;i<=n;i+=lowbit(i)){
		d[id][i]++;
	}
}
inline int query(int id,int x){
	if(x==0) return 0;
	int res=0;
	for(int i=x;i>=1;i-=lowbit(i)){
		res+=d[id][i];
	}
	return res;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int op,l,r;
		cin>>op>>l>>r;
		if(op==1){
			update(1,l);
			update(2,r);
		}else{
			cout<<query(1,r)-query(2,l-1)<<endl;
		}
	}
    return 0;
}
posted @ 2021-10-08 19:09  尹昱钦  阅读(35)  评论(0编辑  收藏  举报