zoukankan      html  css  js  c++  java
  • 【洛谷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
    ",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
    ",a[i],b[i]);
        }
        return 0;
    }
    欢迎转载,转载请注明出处!
  • 相关阅读:
    Python函数知识汇总-课堂笔记
    集合set内部常用功能和使用方法-课堂笔记及课后总结
    win7_64位操作系统安装python3.6.3遇到的问题和解决方法
    字典dic内部常用功能和使用方法-课堂笔记及课后总结
    列表内部常用功能和使用方法-课堂笔记及课后总结
    Python Str内部功能-个人课堂笔记,课后总结
    深入理解Java虚拟机读书笔记9----线程完全与锁优化
    深入理解Java虚拟机读书笔记8----Java内存模型与线程
    深入理解Java虚拟机读书笔记7----晚期(运行期)优化
    深入理解Java虚拟机读书笔记6----早期(编译期)优化
  • 原文地址:https://www.cnblogs.com/huihao/p/7684283.html
Copyright © 2011-2022 走看看