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范围内
标签是矩阵乘法啊,但蒟蒻不会,只会模拟...还只会80分模拟...太弱了!!!
#include<iostream> #include<cstdio> #include<cstring> #define N 500007 using namespace std; int n,m,tot=1,cnt; int a[N][3],pos[N]; struct node { char c; int x,y; }com[N]; struct Lim { int x,y; }lim[N]; inline int init() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { n=init();m=init(); for(int i=1;i<=n;i++) a[i][1]=init(),a[i][2]=init(); for(int i=m;i>0;i--) { cin>>com[i].c; if(com[i].c=='m') com[i].x=init(),com[i].y=init(); } for(int i=1;i<=m;i++) { if(com[i].c=='x') lim[tot].x++; else if(com[i].c=='y') lim[tot].y++; else tot++,pos[tot-1]=i; } for(int i=1;i<=tot;i++) { if(lim[i].x%2!=0) for(int j=1;j<=n;j++) a[j][1]=-a[j][1]; if(lim[i].y%2!=0) for(int j=1;j<=n;j++) a[j][2]=-a[j][2]; for(int j=1;j<=n;j++) { a[j][1]+=com[pos[i]].x; a[j][2]+=com[pos[i]].y; } } for(int i=1;i<=n;i++) printf("%d %d ",a[i][1],a[i][2]); }
想到了提前记录总和,但考虑到取反的时候会出问题,但没想到去反可以吧总和也取反...太弱了!!!!
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=500005,INF=2000000000; int X[maxn],Y[maxn],a[maxn],b[maxn]; char cmd[maxn]; inline int read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int main() { int N=read(),M=read(),p=0,q=0,curx=1,cury=1; char c; for(int i=1; i<=N; i++) X[i]=read(),Y[i]=read(); for(int i=0; i<M; i++) { c=getchar(); while(c!='x'&&c!='m'&&c!='y') c=getchar(); cmd[i]=c; if(c=='m') { a[i]=read(); b[i]=read(); } } for(int i=M-1; i>=0; i--) { if(cmd[i]=='x') p=-p,curx=-curx; else if(cmd[i]=='y') q=-q,cury=-cury; else { p+=a[i]; q+=b[i]; } } for(int i=1; i<=N; i++) printf("%d %d ",X[i]*curx+p,Y[i]*cury+q); return 0; }