【洛谷P2129】L国的战斗续之多路出击
题目背景
广而告之:背景见其他L国的战斗!!大家一起刷
题目描述
这一次,L国决定军队分成n组,分布在各地,若以L国为原点,可以看作在一个直角坐标系内。但是他们都受统一的指挥,指令部共发出m个命令。命令有移动、上下转移和左右转移(瞬移??),但是由于某些奇奇怪怪的原因,军队收到命令总是有延迟,为了方便,军方已经写好一个栈(那还要我干嘛,自己都写好不就行了?),所以你要处理的顺序,应该是从后往前。
输入输出格式
输入格式:
输入文件army.in包括n+m+1行
第一行两个整数n、m
接下来n行
第i行有两个整数xi yi表示第i支军队的位置。
又是m行
每行首先是一个字符 C
若C为m 则紧跟两个整数 p q 表示把每支军队的位置从(xi,yi)移到(xi+p.yi+q)
若C为x 则表示把每支军队的位置从(xi,yi)移到(-xi,yi)
若C为y 则表示把每支军队的位置从(xi,yi)移到(xi,-yi)
输出格式:
输出文件army.out包含n行
第i行有两个整数xi、yi,表示第i支军队移动后的位置。
输入输出样例
输入样例#1:
3 3 0 0 4 -3 6 7 x m -1 2 y
输出样例#1:
1 2 -3 5 -5 -5
说明
对于30%的数据 1≤n≤1000 1≤m≤1000
对于100%的数据 1≤n≤500000 1≤m≤500000 Ai在longint范围内
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=500000+5; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } int n,m; struct mat{ ll m[6][6]; }p[maxn],ans; inline mat matmul(mat a,mat b,int len){ mat res; for(register int i=1;i<=3;++i) for(register int j=1;j<=len;++j){ res.m[i][j]=0; for(register int k=1;k<=3;++k) res.m[i][j]=res.m[i][j]+a.m[i][k]*b.m[k][j]; } return res; } int main(){ n=read();m=read(); ans.m[1][1]=ans.m[2][2]=ans.m[3][3]=1; for(register int i=1;i<=n;++i){ p[i].m[1][1]=read(); p[i].m[2][1]=read(); p[i].m[3][1]=1; } register int x,y; char str[6]; mat tmp; for(register int i=1;i<=m;++i){ scanf("%s",str); if(str[0]=='m'){ x=read();y=read(); tmp.m[1][1]=1;tmp.m[1][2]=0;tmp.m[1][3]=x; tmp.m[2][1]=0;tmp.m[2][2]=1;tmp.m[2][3]=y; tmp.m[3][1]=0;tmp.m[3][2]=0;tmp.m[3][3]=1; }else if(str[0]=='x'){ tmp.m[1][1]=-1;tmp.m[1][2]=0;tmp.m[1][3]=0; tmp.m[2][1]=0; tmp.m[2][2]=1;tmp.m[2][3]=0; tmp.m[3][1]=0; tmp.m[3][2]=0;tmp.m[3][3]=1; }else if(str[0]=='y'){ tmp.m[1][1]=1;tmp.m[1][2]=0;tmp.m[1][3]=0; tmp.m[2][1]=0;tmp.m[2][2]=-1;tmp.m[2][3]=0; tmp.m[3][1]=0;tmp.m[3][2]=0;tmp.m[3][3]=1; } ans=matmul(ans,tmp,3); } for(register int i=1;i<=n;++i){ p[i]=matmul(ans,p[i],1); printf("%lld %lld\n",p[i].m[1][1],p[i].m[2][1]); } return 0; }
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn=500000+5; inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();} return x*f; } int n,m; int a[maxn],b[maxn],p[maxn],q[maxn]; char str[maxn][6]; int main(){ n=read();m=read(); for(register int i=1;i<=n;++i) a[i]=read(),b[i]=read(); for(register int i=1;i<=m;++i){ scanf("%s",str[i]); if(str[i][0]=='m') p[i]=read(),q[i]=read(); } register int x=0,y=0,f1=1,f2=1; for(register int i=m;i>=1;--i){ if(str[i][0]=='m'){ x+=p[i];y+=q[i]; }else if(str[i][0]=='x'){ f1=-f1; x=-x; }else if(str[i][0]=='y'){ f2=-f2; y=-y; } } for(register int i=1;i<=n;++i){ a[i]=a[i]*f1+x; b[i]=b[i]*f2+y; printf("%d %d\n",a[i],b[i]); } return 0; }
欢迎转载,转载请注明出处!