首页 > 代码库 > 洛谷 P2129 L国的战斗续之多路出击(模拟)

洛谷 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 30 04 -36 7xm -1 2y
输出样例#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 500007using 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\n",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\n",X[i]*curx+p,Y[i]*cury+q);    return 0;}

 

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