1. 程式人生 > 其它 >洛谷 P2184 貪婪大陸(樹狀陣列)

洛谷 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;
}