2012-C08-team5-problem-D

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;

#define r first
#define c second

typedef pair<int,int> PII;
int row[40005],col[40005];
int mr=1,dr[2]={1,0};
int mc=1,dc[2]={0,1};
int n,m,A,B,C,D,E,F,G,r1,r2,c1,c2,x;
map<PII,int> w;

PII locate(int r, int c){
    int u=((dr[0]*r+dc[0]*c)*mr+n+1)%(n+1);
    int v=((dr[1]*r+dc[1]*c)*mc+n+1)%(n+1);
    return PII(u,v);
}

PII getpos(PII u){
    return PII(row[u.r],col[u.c]);
}

int getnum(PII u){
    return w.count(u)?w[u]:(u.first*1ll*A+u.second*1ll*B)%C;
}

int main(){
    char s[200];
    scanf("%d%d%d%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D,&E,&F,&G);
    for(int i=1;i<=n;i++) row[i]=col[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%s",s);
        if(!strcmp(s,"WR")){
            scanf("%d%d%d",&r1,&c1,&x);
            w[getpos(locate(r1,c1))]=x;
        }else if(!strcmp(s,"CP")){
            scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
            PII u=getpos(locate(r1,c1));
            PII v=getpos(locate(r2,c2));
            if(u!=v) w[v]=getnum(u);
        }else if(!strcmp(s,"SR")){
            scanf("%d%d",&r1,&r2);
            PII u=locate(r1,0);
            PII v=locate(r2,0);
            swap(row[u.r],row[v.r]);
            swap(col[u.c],col[v.c]);
        }else if(!strcmp(s,"SC")){
            scanf("%d%d",&c1,&c2);
            PII u=locate(0,c1);
            PII v=locate(0,c2);
            swap(row[u.r],row[v.r]);
            swap(col[u.c],col[v.c]);
        }else if(!strcmp(s,"RL")){
            swap(dr[0]*=-1,dr[1]);
            swap(dc[0]*=-1,dc[1]);
        }else if(!strcmp(s,"RR")){
            swap(dr[0],dr[1]*=-1);
            swap(dc[0],dc[1]*=-1);
        }else if(!strcmp(s,"RV")){
            if(dr[0]) mc*=-1; else mr*=-1;
        }else if(!strcmp(s,"RH")){
            if(dr[0]) mr*=-1; else mc*=-1;
        }
    }
    int H=314159265;
    for(int r=D;r<=E;r++)
    for(int c=F;c<=G;c++){
        PII u=getpos(locate(r,c));
        H=(31*1ll*H+getnum(u))%1000000007;
    }
    printf("%d\n",H);
}
}}}
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
#define r first
#define c second
typedef pair<int,int> PII;
int row[40005],col[40005];
int mr=1,dr[2]={1,0};
int mc=1,dc[2]={0,1};
int n,m,A,B,C,D,E,F,G,r1,r2,c1,c2,x;
map<PII,int> w;
PII locate(int r, int c){
    int u=((dr[0]*r+dc[0]*c)*mr+n+1)%(n+1);
    int v=((dr[1]*r+dc[1]*c)*mc+n+1)%(n+1);
    return PII(u,v);
}
PII getpos(PII u){
    return PII(row[u.r],col[u.c]);
}
int getnum(PII u){
    return w.count(u)?w[u]:(u.first*1ll*A+u.second*1ll*B)%C;
}
int main(){
    char s[200];
    scanf("%d%d%d%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D,&E,&F,&G);
    for(int i=1;i<=n;i++) row[i]=col[i]=i;
    for(int i=1;i<=m;i++){
        scanf("%s",s);
        if(!strcmp(s,"WR")){
            scanf("%d%d%d",&r1,&c1,&x);
            w[getpos(locate(r1,c1))]=x;
        }else if(!strcmp(s,"CP")){
            scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
            PII u=getpos(locate(r1,c1));
            PII v=getpos(locate(r2,c2));
            if(u!=v) w[v]=getnum(u);
        }else if(!strcmp(s,"SR")){
            scanf("%d%d",&r1,&r2);
            PII u=locate(r1,0);
            PII v=locate(r2,0);
            swap(row[u.r],row[v.r]);
            swap(col[u.c],col[v.c]);
        }else if(!strcmp(s,"SC")){
            scanf("%d%d",&c1,&c2);
            PII u=locate(0,c1);
            PII v=locate(0,c2);
            swap(row[u.r],row[v.r]);
            swap(col[u.c],col[v.c]);
        }else if(!strcmp(s,"RL")){
            swap(dr[0]*=-1,dr[1]);
            swap(dc[0]*=-1,dc[1]);
        }else if(!strcmp(s,"RR")){
            swap(dr[0],dr[1]*=-1);
            swap(dc[0],dc[1]*=-1);
        }else if(!strcmp(s,"RV")){
            if(dr[0]) mc*=-1; else mr*=-1;
        }else if(!strcmp(s,"RH")){
            if(dr[0]) mr*=-1; else mc*=-1;
        }
    }
    int H=314159265;
    for(int r=D;r<=E;r++)
    for(int c=F;c<=G;c++){
        PII u=getpos(locate(r,c));
        H=(31*1ll*H+getnum(u))%1000000007;
    }
    printf("%d\n",H);
}