hud 1892 (二维树状数组)

来源:互联网 发布:php开发技术 编辑:程序博客网 时间:2024/05/29 12:41

这道题原理一点都不难,但是硬是磨了我一个上午,醉了。

主要是输出格式弄错了,还有数组的界限问题。发火

最重要的是输入的值最好都加一,以免for循环(二重)的时候 i == 0,就停下来了,下面的循环可能还没结束

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;int map[1005][1005];int lowbit(int t) {    return t & (-t);}void add(int x,int y,int v) {    for(int i = x;i < 1002;i += lowbit(i))  //这里设置1002就过了,开1001就wa,醉了        for(int j = y;j < 1002;j += lowbit(j)) //开两个for来循环。            map[i][j] += v;}long long getsum(int x,int y) {    long long sum = 0;    for(int i = x;i > 0;i -= lowbit(i))        for(int j = y;j > 0;j -= lowbit(j)) {            sum += map[i][j];        }    return sum;}int main() {     int t,n;     scanf("%d",&t);     for(int ll = 1;ll <= t;ll++) {         printf("Case %d:\n",ll);         scanf("%d",&n);         memset(map,0,sizeof(map));         for(int i = 1;i <= 1001;i++)             for(int j = 1;j <= 1001;j++)                 add(i,j,1);         while(n--) {             char str[20];             scanf("%s",str);             if(str[0] == 'S') {                 int X1,Y1,X2,Y2,x1,y1,x2,y2;                 scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2);                 x1 = min(X1,X2);                 x2 = max(X1,X2);                 y1 = min(Y1,Y2);                 y2 = max(Y1,Y2); //这里要确认大的面积减去小的面积                 printf("%I64d\n",getsum(x2+1,y2+1) - getsum(x2+1,y1) - getsum(x1,y2+1) + getsum(x1,y1)); //二维按照面积来减,可以想一下,最后就是这样             }             else if(str[0] == 'A') {                 int x,y,v;                 scanf("%d%d%d",&x,&y,&v);                 add(x+1,y+1,v);             }             else if(str[0] == 'D') {                 int x,y,v;                 scanf("%d%d%d",&x,&y,&v);                 int tt = getsum(x+1,y+1) - getsum(x,y+1) - getsum(x+1,y) + getsum(x,y);                 v = min(v,tt);                 add(x+1,y+1,-v);             }             else {                 int x1,y1,x2,y2,v;                 scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&v);                 int tt = getsum(x1+1,y1+1) - getsum(x1,y1+1) - getsum(x1+1,y1) + getsum(x1,y1);                 v = min(v,tt);                 add(x1+1,y1+1,-v);                 add(x2+1,y2+1,v);             }         }     }     return 0;}

哎,浪费好多时间,继续继续~~偷笑

0 0
原创粉丝点击