HDU-물만두 기정 2차원 트리 배열

8252 단어 트리 배열
이 문제는 간단한 2차원 나무수조로 바둑판의 최신 상태를 보존하면 된다. 나무수조 안에는 원래의 기초 위에서 증가하거나 감소한 어떤 만두의 수량만 보존한다.
코드는 다음과 같습니다.
#include <cstring>

#include <cstdlib>

#include <cstdio>

using namespace std;



char op[5];



char G[1050][1050];



int cc[1050][1050];

//



void init()

{

    int k = 0;  //      1,   0

    for (int i = 1;  i <= 1024; ++i) {

        for (int j = 1; j <= 1025; ++j) {  

        //                   ,          k

            G[i][j] = (k ^= 1);

        }

    }

}



int lowbit(int x)

{

    return x & -x;

}



void modify(int x, int y, int val)

{

    for (int i = x; i <= 1024; i += lowbit(i)) {

        for (int j = y; j <= 1024; j += lowbit(j)) {

            cc[i][j] += val;

        }

    }

}



int sum(int x, int y)

{

    int tot = 0;

    for (int i = x; i > 0; i -= lowbit(i)) {

        for (int j = y; j > 0; j -= lowbit(j)) { 

            tot += cc[i][j];

        }

    }

    return tot;

}



int main()

{

    int T, a, b, c, d, k;

    int A, B, C, S;

    while (scanf("%d", &T) == 1) {

        init();

        memset(cc, 0, sizeof (cc));

        while (T--) {    

            scanf("%s", op);

            if (op[0] == 'R') {

                scanf("%d %d %d %d", &a, &b, &c, &d);

                A = sum(c, d) - sum(c, b-1) - sum(a-1, d) + sum(a-1, b-1);

                if ((a + b) & 1) {  //     

                    S = (c-a+1)*(d-b+1) / 2;

                }

                else {

                    S = ((c-a+1)*(d-b+1) + 1)/ 2;

                }

                B = S + A;

                C = (c-a+1)*(d-b+1) - B;

                printf("%d %d
", B, C); } else { // 'A' ,‘B’ scanf("%d %d", &a, &b); k = op[0] == 'A'; // 1 ,0 if (k != G[a][b]) { G[a][b] = k; if (k) { modify(a, b, 1); } else { modify(a, b, -1); } } } } } return 0; }

좋은 웹페이지 즐겨찾기