洛谷 P2184 貪婪大陸(樹狀陣列)
阿新 • • 發佈:2021-10-08
傳送門
解題思路
一直往掃描線方面想,結果自己沒想出來,還是運用的不夠靈活。
其實很簡單,對於查詢區間[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; }