2016ACM/ICPC Shengyang Online-1001 Resident Evil

题意和题解均参考:https://async.icpc-camp.org/d/560-2016-icpc

题意:有一个n*n的格子, 有50种怪物. 有m个操作, 每次操作会往一个矩形区域放怪物, 每个格子放相同数目的怪物, 或者查询当前50种怪物的奇偶性.

题解:把怪物个数的奇偶性用来表示就变成了一个裸二维树状数组, 考虑分成4个二维树状数组做, 具体参考Iahub and Xors. 需要注意, 同一种怪物在P操作里面会出现多次.

ps.统计(1,1,x,y)中xor和的时候,只有(x,y),(x-2,y),(x-4,y)等格子会对这个矩阵的和产生影响

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N=3010;
long long T[4][N][N];
int n,m;
int Get(int x,int y){
    int Res=0;
    if (x%2)Res+=1;
    if (y%2)Res+=2;
    return Res;
}
void Add(int x,int y,long long v)
{
    int Index=Get(x,y);
    for (int i=x;i<=n;i+=i&(-i))
        for (int j=y;j<=n;j+=j&(-j))
            T[Index][i][j]^=v;
}
long long Sum(int x,int y)
{
    long long Res=0;
    int Index=Get(x,y);
    for (int i=x;i;i-=i&(-i))
        for (int j=y;j;j-=j&(-j))
            Res^=T[Index][i][j];
    return Res;
}
int main()
{
    while (scanf("%d%d",&n,&m)!=EOF){
        memset(T,0,sizeof T);
        char str[10];int x0,y0,x1,y1,K;long long v;
        while (m--){
            v=0;
            scanf("%s",str);
            if (str[0]=='P'){
                scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&K);
                for (int i=1;i<=K;i++){
                    int A,B;scanf("%d%d",&A,&B);
                    if (B&1)v^=(1LL<<(A-1));
                }
                Add(x0,y0,v);
                Add(x1+1,y0,v);
                Add(x0,y1+1,v);
                Add(x1+1,y1+1,v);
            }else{
                scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
                v^=Sum(x1,y1);
                v^=Sum(x1,y0-1);
                v^=Sum(x0-1,y1);
                v^=Sum(x0-1,y0-1);
                for (int i=1;i<50;i++)
                    printf("%d ",(v&(1LL<<(i-1)))?2:1);
                printf("%d \n",(v&(1LL<<(50-1)))?2:1);
            }
        }
    }
    return 0;
}


发布了74 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/MustImproved/article/details/52597203