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