题意:
三维空间上定义了一些操作,就不翻译了……求每个询问操作的结果
题解:
本来以为很难,后来发现三个坐标是独立的,所以做到当前操作时,可以维护一个映射关系,原本的xi现在应该在xj,就可以直接求了。
难怪过的人最多
//Time:110ms
//Memory:204KB
//Length:1354B
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define MAXN 1010
int to[3][MAXN],nto[3][MAXN];
char str[20];
int main()
{
//freopen("/home/moor/Code/input","r",stdin);
int xy[3];
while (scanf("%s",str)!=-1)
{
if(str[2]=='L')
{
for(int i=0;i<3;++i) scanf("%d",&xy[i]);
for(int i=0;i<3;++i)
for(int j=0;j<=xy[i];++j) to[i][j]=j,nto[i][j]=j;
printf("START\n");
}
if(str[2]=='A')
{
int a,b,af,bf,w=str[4]-'1';
scanf("%d%d",&a,&b);
af=nto[w][a],bf=nto[w][b];
swap(nto[w][a],nto[w][b]);
swap(to[w][af],to[w][bf]);
}
if(str[2]=='N')
{
long long x;
int tx,ty,tz,tmp=xy[1]*xy[2];
scanf("%lld",&x);
if(x>xy[0]*xy[1]*xy[2]) continue;
--x;
tx=x/tmp,ty=x/xy[2]%xy[1],tz=x%xy[2];
tx=to[0][tx],ty=to[1][ty],tz=to[2][tz];
printf("%d %d %d\n",tx,ty,tz);
}
if(str[2]=='E')
{
int tx,ty,tz;
scanf("%d%d%d",&tx,&ty,&tz);
tx=nto[0][tx],ty=nto[1][ty],tz=nto[2][tz];
printf("%d\n",xy[1]*xy[2]*tx+xy[2]*ty+tz+1);
}
}
return 0;
}