【洛谷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;
}

 

posted @ 2017-10-17 22:16  沐灵_hh  阅读(197)  评论(0编辑  收藏  举报