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/

浙公网安备 33010602011771号