Problem B
Time Limit : 5000/3000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 33 Accepted Submission(s) : 10
When coming into our training room, a lot of books are in my eyes. And every time the books are moving from one place to another one. Now give you the position of the books at the early of the day. And the moving information of the books the day, your work is to tell me how many books are stayed in some rectangles.
To make the problem easier, we divide the room into different grids and a book can only stayed in one grid. The length and the width of the room are less than 1000. I can move one book from one position to another position, take away one book from a position or bring in one book and put it on one position.
2 3 S 1 1 1 1 A 1 1 2 S 1 1 1 1 3 S 1 1 1 1 A 1 1 2 S 1 1 1 2
Case 1: 1 3 Case 2: 1 4下面是我的一直WA的代码:#include<iostream> #include<string.h> const int N=1010; using namespace std; int aa[N][N]; int cc[N][N];
int max(int a,int b) { if(a<b) a=b; return a; } int min(int a,int b) { if(a>b) a=b; return a; }
int lowbit(int r) { return r&(-r); }
long long find(int i, int j) { long long result = 0; for(int x = i; x > 0; x -= lowbit(x)) { for(int y = j; y > 0; y -= lowbit(y)) { result += cc[x][y]; } } return result; }
void update(int x,int y,int m) { /*int t=y; while(x<=N) { y=t; while(y<=N) { cc[x][y]+=m; y+=lowbit(y); } x+=lowbit(x); }*/ int i,j; for(i=x;i<N;i+=lowbit(i)) { for(j=y;j<N;j+=lowbit(j)) cc[i][j]+=m; } }
int main() { int ttt,n; int x1,y1,x2,y2,m; int jishu=0; char c; int maxx,maxy,minx,miny; cin>>ttt; while(ttt--) {
jishu++; cin>>n; memset(aa,0,sizeof(aa)); memset(cc,0,sizeof(cc)); for(int k=1;k<=N;k++) { for(int h=1;h<=N;h++) { update(k,h,1); aa[k][h]=1; } }
cout<<"Case "<<jishu<<":"<<endl; for(int i=1;i<=n;i++) { cin>>c; if(c=='S') { cin>>x1>>y1>>x2>>y2; maxx=max(x1,x2); maxy=max(y1,y2); minx=min(x1,x2); miny=min(y1,y2);
int A=find(maxx+1,maxy+1); int B=find(minx,miny); int C=find(minx,maxy+1); int D=find(maxx+1,miny); //cout<<"A"<<A<<"B"<<B<<"C"<<C<<"D"<<D<<endl; cout<<A+B-C-D<<endl;
} else if(c=='A') { cin>>x1>>y1>>m;
update(x1+1,y1+1,m); aa[x1+1][y1+1]+=m; } else if(c=='M') { cin>>x1>>y1>>x2>>y2>>m; if(aa[x1+1][y1+1]>=m) {
update(x1+1,x2+1,-m); update(x2+1,y2+1,m);
aa[x1+1][y1+1]-=m; aa[x2+1][y2+1]+=m; } else { int zanshi=aa[x1+1][y1+1];
update(x1+1,y1+1,-zanshi); update(x2+1,y2+1,zanshi); aa[x1+1][y1+1]=0; aa[x2+1][y2+1]+=zanshi; }
} else if(c=='D') { cin>>x1>>y1>>m; if(aa[x1+1][y1+1]>=m) { update(x1+1,y1+1,-m); aa[x1+1][y1+1]-=m; } else { int zanshi=aa[x1+1][y1+1]; update(x1+1,y1+1,-zanshi); aa[x1+1][y1+1]=0; } } } } return 0; }
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
#define inf 1010
int c[1011][1011],a[1011][10011];
int min(int a,int b)
{
if(a<b) return a;
return b;
}
int lowbit(int i)
{
return i&(-i);
}
long long sum(int x,int y)
{
long long res=0;
for(;x>0;x-=lowbit(x))
{
for(int j=y;j>0;j-=lowbit(j))
res+=c[x][j];
}
return res;
}
void add(int x,int y,int num)
{
for(;x<inf;x+=lowbit(x))
{
for(int j=y;j<inf;j+=lowbit(j))
c[x][j]+=num;
}
}
/*int lowbit(int i)
{
return i&(-i);
}
void add(int x,int y,int data)
{
for(;x<inf;x+=lowbit(x))
{
for(int j=y;j<inf;j+=lowbit(j))
c[x][j]+=data;
}
}
long long sum(int x,int y)
{
long long res=0;
for(;x>0;x-=lowbit(x))
{
for(int j=y;j>0;j-=lowbit(j))
res+=c[x][j];
}
return res;
}*/
int main()
{
int i,j,t,q,k,x1,x2,y1,y2,n1;
scanf("%d",&t);
string ss;
for(i=1;i<=t;i++)
{
scanf("%d",&q);
//memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(j=1;j<=1002;j++)
{
for(k=1;k<=1002;k++)
{
add(j,k,1);
a[j][k]=1;
}
}
cout<<"Case "<<i<<":"<<endl;
while(q--)
{
cin>>ss;
if(ss=="S")
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++;y1++;x2++;y2++;
if(x1>x2)
swap(x1,x2);
if(y1>y2)
swap(y1,y2);
cout<<sum(x2,y2)+sum(x1-1,y1-1)-sum(x2,y1-1)-sum(x1-1,y2)<<endl;
}
if(ss=="A")
{
//cin>>x1>>y1>>n1;
scanf("%d%d%d",&x1,&y1,&n1);
add(x1+1,y1+1,n1);
a[x1+1][y1+1]+=n1;
}
if(ss=="D")
{
scanf("%d%d%d",&x1,&y1,&n1);
//n1=min(n1,a[x1+1][y1+1]);
if(n1>a[x1+1][y1+1])
n1=a[x1+1][y1+1];
add(x1+1,y1+1,-n1);
a[x1+1][y1+1]-=n1;
}
if(ss=="M")
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
//n1=min(n1,a[x1+1][y1+1]);
if(n1>a[x1+1][y1+1])
n1=a[x1+1][y1+1];
add(x1+1,y1+1,-n1);
a[x1+1][y1+1]-=n1;
add(x2+1,y2+1,n1);
a[x2+1][y2+1]+=n1;
}
}
}
}