标签:
Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 4753 Accepted Submission(s): 1518
/* 给定4种操作: S x1 y1 x2 y2 询问以(x1 , y1) - (x2 , y2)为对角线的矩形的面积,但是这个对角线不一定是正对角线。 A x1 y1 n 把点(x1 , y1)加上n。 D x1 y1 n点(x1 , y1)减去n如果不足n就全部删除即可。 M x1 y1 x2 y2 n 把点(x1 , y1)点值中扣除n加到(x2 , y2),如果不过n则把(x1 , y1)值全部加到(x2 , y2) */ #include<iostream> #include<stdio.h> #include<cmath> #include<string.h> #define lowbit(x) x&(-x) #define N 1005 using namespace std; int t,n; int c[N][N]; void update(int x,int y,int val) { //int flag=fabs(val); // while(x<N) // { // while(y<N) // { // cout<<x<<" "<<y<<endl; // c[x][y]+=val; // if(c[x][y]<0) // { // flag=c[x][y]+val; // c[x][y]=0; // } // y+=lowbit(y); // } // x+=lowbit(x); // } for(int i=x;i<N;i+=lowbit(i)) { for(int j=y;j<N;j+=lowbit(j)) { c[i][j]+=val; // if(c[i][j]<0) // { // flag=c[i][j]+val; // c[i][j]=0; // } } } // return val;//返回你实际搬运的东西 } int getsum(int x,int y) { int s=0; // while(x>0) // { // while(y>0) // { // s+=c[x][y]; // y-=lowbit(y); // } // x-=lowbit(x); // } for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { s+=c[i][j]; } } return s; } // int getS(int x1,int y1,int x2,int y2) // { // cout<<getsum(x1,y1)<<" "<<getsum(x1-1,y2)<<" "<<getsum(x2,y1-1)<<" "<<getsum(x2-1,y2-1)<<endl; // return getsum(x1,y1)-getsum(x1,y2-1)-getsum(x2-1,y1)+getsum(x2-1,y2-1); // } int main() { //freopen("C:\\Users\\acer\\Desktop\\in.txt","r",stdin); scanf("%d",&t); int Case=1; while(t--) { printf("Case %d:\n",Case++); scanf("%d",&n); int x1,x2,y1,y2,val; memset(c,0,sizeof c); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) update(i,j,1); //cout<<getsum(1,1)<<" "<<getsum(2,2)<<endl; for(int i=0;i<n;i++) { //getchar(); char op[5]; scanf("%s",&op); //getchar(); if(op[0]==‘A‘||op[0]==‘D‘) { scanf("%d%d%d",&x1,&y1,&val); x1++;y1++; if(op[0]==‘D‘) val=-min(val,getsum(x1,y1)-getsum(x1-1,y1)-getsum(x1,y1-1)+getsum(x1-1,y1-1)); update(x1,y1,val); } else if(op[0]==‘M‘) { scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val); x1++;x2++;y1++;y2++; int temp=min(val,getsum(x1,y1)-getsum(x1-1,y1)-getsum(x1,y1-1)+getsum(x1-1,y1-1));//这个是你实际从前一个点搬走的东西 update(x1,y1,-temp); update(x2,y2,temp); } else { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(x1<x2) swap(x1,x2); if(y1<y2) swap(y1,y2);//并不一定是正对角线 x1++;x2++;y1++;y2++; //cout<<x1<<" "<<y1<<" "<<x2<<" "<<y2<<endl; //cout<<"getsum(x2,y2)="<<getsum(x2,y2)<<endl; // cout<<getsum(x1,y1)<<" "<<getsum(x1,y2-1)<<" "<<getsum(x2-1,y1)<<" "<<getsum(x2-1,y2-1)<<endl; printf("%d\n",getsum(x1,y1)-getsum(x1,y2-1)-getsum(x2-1,y1)+getsum(x2-1,y2-1)); } } } return 0; } /* Case 1: 1 3 Case 2: 1 4 */
标签:
原文地址:http://www.cnblogs.com/wuwangchuxin0924/p/5894269.html