二維樹狀陣列模板(單點更新,區間求和)(以HDU 2642為例)
阿新 • • 發佈:2018-12-18
題目:點選開啟連結 題意:輸入B後輸入座標,表示對應的點的燈變亮,輸入D後輸入座標表示對應的點燈滅,輸入Q後輸入一個矩形的左下角和右上角 輸出矩形內亮著的等的個數,注意燈亮過不能再亮,燈關了不能再關,所以用陣列標記,樹狀陣列模板中元素下標均從1開始,題目從0開始所以加1。
分析:二維樹狀陣列單點更新,區間求和裸題。總結下板子。tree[x][y]記錄的是右下角為(x, y),高為lowbit(x), 寬為 lowbit(y)的區間的區間和。學習參考https://www.cnblogs.com/RabbitHu/p/BIT.html。 程式碼:
#pragma comment(linker, "/STACK:102400000,102400000") #include<unordered_map> #include<unordered_set> #include<algorithm> #include<iostream> #include<fstream> #include<complex> #include<cstdlib> #include<cstring> #include<cassert> #include<iomanip> #include<string> #include<cstdio> #include<bitset> #include<vector> #include<cctype> #include<cmath> #include<ctime> #include<stack> #include<queue> #include<deque> #include<list> #include<set> #include<map> using namespace std; #define pt(a) cout<<a<<endl #define debug test #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define rep(i,a,n) for (int i=a;i<=n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pii pair<int,int> #define fi first #define se second #define ll long long #define ull unsigned long long #define pb push_back #define mp make_pair #define inf 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) #define lb(x) (x&(-x)) const ll mod = 1e9+7; const int N = 1e3+10; ll qp(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} int to[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int m,tr[N][N],vs[N][N]; void upd(int x,int y,int v) { for(int i=x;i<N;i+=lb(i)) for(int j=y;j<N;j+=lb(j)) tr[i][j]+=v; } int qy(int x,int y) { int res=0; for(int i=x;i>0;i-=lb(i)) for(int j=y;j>0;j-=lb(j)) res+=tr[i][j]; return res; } int main() { ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); while(~scanf("%d",&m)) { mst(vs,0); while(m--) { char s[10]; int x,y,x1,y1; scanf("%s",&s); if(s[0]=='B') { scanf("%d%d",&x,&y); x++,y++; if(vs[x][y]==0) upd(x,y,1),vs[x][y]=1; }else if(s[0]=='D') { scanf("%d%d",&x,&y); x++,y++; if(vs[x][y]==1) upd(x,y,-1),vs[x][y]=0; }else { scanf("%d%d%d%d",&x,&x1,&y,&y1); x++,x1++,y++,y1++; if(x>x1) swap(x,x1); if(y>y1) swap(y,y1); int ans=qy(x1,y1)-qy(x-1,y1)-qy(x1,y-1)+qy(x-1,y-1); printf("%d\n",ans); } } } return 0; }