hdu1892树状数组
按理来说应该会有二维的树状数组的算法吧。。可是我不知道。。于是就用一维的方式在累加了。。时间复杂度大概在o(m*n*log(n))。。直接暴力是o(m*n^2)
#include<iostream> using namespace std; const int MAXN=1003; int data[MAXN][MAXN]; void swap(int &a,int &b) { int t; t=a; a=b; b=t; } int lowbit(int idx) { return idx & (-idx); } void add(int x,int y,int inc,int n) { for (int i = x; i <= n; i += lowbit(i)) { data[y][i] += inc; } return ; } int sum_of(int pos,int y) { int sum = 0; for (int i = pos; i > 0; i -= lowbit(i)) { sum += data[y][i]; } return sum; } void init() { int i,j; for(i=1;i<=MAXN-1;i++) for(j=1;j<=MAXN-1;j++) { data[i][j]=lowbit(j); //cout<<data[i][j]<<" "; } } int main() { int t; cin>>t; int i=0; for(i=1;i<=t;i++) { cout<<"Case "<<i<<":"<<endl; init(); int q; cin>>q; while(q--) { char c; cin>>c; switch(c) { int x1,y1,x2,y2,n1; case 'S': { int suum=0; int j; cin>>x1>>y1>>x2>>y2; x1++; x2++; y1++; y2++; if(y1>y2) { swap(x1,x2); swap(y1,y2); } for(j=y1;j<=y2;j++) { if(x1>x2) { swap(x1,x2); } suum=suum+sum_of(x2,j)-sum_of(x1-1,j); } cout<<suum<<endl; } break; case 'A': cin>>x1>>y1>>n1; x1++; y1++; add(x1,y1,n1,MAXN); break; case 'D': { cin>>x1>>y1>>n1; x1++; y1++; int numxy=sum_of(x1,y1)-sum_of(x1-1,y1); if(numxy-n1<0) { add(x1,y1,-numxy,MAXN); }else { add(x1,y1,-n1,MAXN); } break; } case 'M': { cin>>x1>>y1>>x2>>y2>>n1; x1++; y1++; x2++; y2++; int numxy=sum_of(x1,y1)-sum_of(x1-1,y1); if(numxy-n1<0) { add(x1,y1,-numxy,MAXN); add(x2,y2,numxy,MAXN); }else { add(x1,y1,-n1,MAXN); add(x2,y2,n1,MAXN); } break; } } } } return 0; }
本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
独立博客:http://nfeng.cc/