E - Rotate and Flip ###K //K

题目链接:https://atcoder.jp/contests/abc189/tasks/abc189_e

题意:给定四种操作 ,m次操作后 q次查询 每次查询某个时间点和某数 要求给出 x和y的坐标

思路:模拟一下可以发现  第一种操作是 x y -> y -x   第二种操作  -y x  第三种操作 2*p-x y  第四种操作 x 2*p-y

可以发现每个数 前面半段数是一样的 只需要维护 自己的x和y值更新即可

先分开处理 就处理公共部分 直接按题意模拟即可  然后处理每个数自己的x和y  用turn来记录有无翻转 有f1 f2 记录 x和y的符号位

来模拟即可  注意f1一定要对上x的符号位 f2一定要对上y的符号即可  不能够 用f1 记录位置1的符号 f2记录位置2的符号

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=2e5+10;
 4 const int mod=998244353;
 5 #define ll long long
 6 #define pb push_back
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 
11 int n,m,q;
12 ll x[maxn],y[maxn];
13 int f1[maxn],f2[maxn];
14 int turn[maxn];
15 ll X[maxn],Y[maxn];
16 
17 int main()
18 {
19     ios::sync_with_stdio(0);
20     cin.tie(0);
21     cin>>n;
22     for(int i=1;i<=n;i++) cin>>X[i]>>Y[i];
23     cin>>m;
24     f1[0]=f2[0]=1;
25     for(int i=1;i<=m;i++)
26     {
27         x[i]=x[i-1],y[i]=y[i-1];
28         f1[i]=f1[i-1],f2[i]=f2[i-1];
29         turn[i]=turn[i-1];
30         int o;
31         cin>>o;
32         if(o==1)
33         {
34             swap(x[i],y[i]),y[i]=-y[i];
35             if(turn[i]) f2[i]*=-1;
36             else f1[i]*=-1;
37             turn[i]^=1;
38         }
39         if(o==2)
40         {
41             swap(x[i],y[i]),x[i]=-x[i];
42             if(turn[i]) f1[i]*=-1;
43             else f2[i]*=-1;
44             turn[i]^=1;
45         }
46         if(o==3)
47         {
48             ll p;
49             cin>>p;
50             x[i]=2*p-x[i];
51             if(turn[i]) f2[i]*=-1;
52             else f1[i]*=-1;
53         }
54         if(o==4)
55         {
56             ll p;
57             cin>>p;
58             y[i]=2*p-y[i];
59             if(turn[i]) f1[i]*=-1;
60             else f2[i]*=-1;
61         }
62     }
63     cin>>q;
64     while(q--)
65     {
66         int a,b;
67         cin>>a>>b;
68         ll ansx=x[a],ansy=y[a];
69         if(turn[a]) ansx+=Y[b]*f2[a],ansy+=X[b]*f1[a];
70         else ansx+=X[b]*f1[a],ansy+=Y[b]*f2[a];
71         cout<<ansx<<" "<<ansy<<'\n';
72 
73     }
74 
75 
76 
77 }
View Code

 

或者每次具体看 当前的x坐标是 x来顶替 还是y 来顶替  然后对相应的x或者y更新就好

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define pi pair<int,int>
  5 #define pb push_back
  6 #define fi first
  7 #define sc second
  8 #define ull unsigned long long
  9 const int maxn=2e5+10;
 10 const int mod=998244353;
 11 
 12 
 13 int fx[maxn],fy[maxn];
 14 int flag[maxn];
 15 ll sumx[maxn],sumy[maxn];
 16 int X[maxn],Y[maxn];
 17 
 18 
 19 
 20 int main()
 21 {
 22     ios::sync_with_stdio(0);
 23     cin.tie(0);
 24     int n;
 25     cin>>n;
 26     for(int i=1;i<=n;i++) cin>>X[i]>>Y[i];
 27     int m;
 28     cin>>m;
 29     fx[0]=1;
 30     fy[0]=1;
 31     for(int i=1;i<=m;i++)
 32     {
 33         fx[i]=fx[i-1];
 34         fy[i]=fy[i-1];
 35         flag[i]=flag[i-1];
 36         sumx[i]=sumx[i-1];
 37         sumy[i]=sumy[i-1];
 38         int x;
 39         cin>>x;
 40         if(x==1)
 41         {
 42             if(flag[i])
 43             {
 44                 fy[i]*=-1;
 45                 sumy[i]=-sumy[i];
 46             }
 47             else
 48             {
 49                 fx[i]*=-1;
 50                 sumx[i]=-sumx[i];
 51             }
 52             flag[i]^=1;
 53         }
 54         else if(x==2)
 55         {
 56             if(!flag[i])
 57             {
 58                 fy[i]*=-1;
 59                 sumy[i]=-sumy[i];
 60             }
 61             else
 62             {
 63                 fx[i]*=-1;
 64                 sumx[i]=-sumx[i];
 65             }
 66             flag[i]^=1;
 67         }
 68         else if(x==3)
 69         {
 70             ll p;
 71             cin>>p;
 72             p*=2;
 73             if(!flag[i])
 74             {
 75                 sumx[i]=-sumx[i];
 76                 sumx[i]+=p;
 77                 fx[i]*=-1;
 78             }
 79             else
 80             {
 81                 sumy[i]=-sumy[i];
 82                 sumy[i]+=p;
 83                 fy[i]*=-1;
 84             }
 85         }
 86         else
 87         {
 88             ll p;
 89             cin>>p;
 90             p*=2;
 91             if(flag[i])
 92             {
 93                 sumx[i]=-sumx[i];
 94                 sumx[i]+=p;
 95                 fx[i]*=-1;
 96             }
 97             else
 98             {
 99                 sumy[i]=-sumy[i];
100                 sumy[i]+=p;
101                 fy[i]*=-1;
102             }
103         }
104     }
105 
106     int q;
107     cin>>q;
108     while(q--)
109     {
110         int a,b;
111         cin>>a>>b;
112         if(flag[a])
113         {
114             cout<<sumy[a]+Y[b]*fy[a]<<" "<<sumx[a]+X[b]*fx[a]<<'\n';
115         }
116         else
117         {
118             cout<<sumx[a]+X[b]*fx[a]<<" "<<sumy[a]+Y[b]*fy[a]<<'\n';
119         }
120     }
121 
122 
123 
124 }
View Code

 

posted @ 2021-01-28 11:41  canwinfor  阅读(102)  评论(0)    收藏  举报