• 洛谷 P2129 L国的战斗续之多路出击(模拟)


    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]);
    }
    80分

    想到了提前记录总和,但考虑到取反的时候会出问题,但没想到去反可以吧总和也取反...太弱了!!!!

    #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;
    }
    折花枝,恨花枝,准拟花开人共卮,开时人去时。 怕相思,已相思,轮到相思没处辞,眉间露一丝。
  • 相关阅读:
    填空练习(指向指针的指针)
    练习指针函数:编写一个函数,输入n为偶数时,调用fa函数,当输入n为奇数时,调用fb函数(利用指针函数)。
    输入一个整数,并将其反转后输出。
    有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
    案例练习
    操作don树
    Node对象
    element对象二
    element对象
    在末尾添加节点
  • 原文地址:https://www.cnblogs.com/L-Memory/p/7209268.html
Copyright © 2020-2023  润新知