HDU 1892 See you~

    最裸的二维树状数组,但是因为内存太大(c[1010][1010]),好像不能运行,结果蒙着写,写了好久。。

 

代码:

HDU 1892 See you~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 1010

int c[N][N];

int lowbit(int x)
{
    return x&(-x);
}

void modify(int x,int y,int val)
{
    for(int i=x;i<=N;i+=lowbit(i))
    {
        for(int j=y;j<=N;j+=lowbit(j))
        {
            c[i][j] += val;
        }
    }
}

int sum(int x,int y)
{
    int res = 0;
    for(int i=x;i>0;i-=lowbit(i))
    {
        for(int j=y;j>0;j-=lowbit(j))
        {
            res += c[i][j];
        }
    }
    return res;
}

int GetIt(int x1,int y1,int x2,int y2)
{
    int maxx = max(x1,x2);
    int maxy = max(y1,y2);
    int minx = min(x1,x2);
    int miny = min(y1,y2);
    return sum(maxx+1,maxy+1)-sum(minx,maxy+1)-sum(maxx+1,miny)+sum(minx,miny);
}

int main()
{
    int t,q,i,j;
    int x1,x2,y1,y2,n1;
    char ss[4];
    int cs = 1;
    scanf("%d",&t);
    while(t--)
    {
        printf("Case %d:\n",cs++);
        scanf("%d",&q);
        memset(c,0,sizeof(c));
        for(i=1;i<N;i++)
        {
            for(j=1;j<N;j++)
            {
                modify(i,j,1);
            }
        }
        while(q--)
        {
            scanf("%s",ss);
            if(ss[0] == S)
            {
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                printf("%d\n",GetIt(x1,y1,x2,y2));
            }
            else if(ss[0] == A)
            {
                scanf("%d%d%d",&x1,&y1,&n1);
                modify(x1+1,y1+1,n1);
            }
            else if(ss[0] == D)
            {
                scanf("%d%d%d",&x1,&y1,&n1);
                int val = sum(x1+1,y1+1)-sum(x1,y1+1)-sum(x1+1,y1)+sum(x1,y1);
                int Min = min(n1,val);
                modify(x1+1,y1+1,-Min);
            }
            else if(ss[0] == M)
            {
                scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);
                int val = sum(x1+1,y1+1)-sum(x1,y1+1)-sum(x1+1,y1)+sum(x1,y1);
                int Min = min(n1,val);
                modify(x1+1,y1+1,-Min);
                modify(x2+1,y2+1,Min);
            }
        }
    }
    return 0;
}
View Code

HDU 1892 See you~

上一篇:isis常见面试题


下一篇:ISIS路由泄露,如何避免路由环路?