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);
}