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 }
或者每次具体看 当前的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 }

浙公网安备 33010602011771号