E - Rotate and Flip (思维)
考试的时候,维护的东西维护错了。
正解应该是维护,
x
,
y
x,y
x,y的符号和,
x
,
y
x,y
x,y对应要加的数,还有
x
,
y
x,y
x,y是否交换即可。
然后模拟就行了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n,x[N],y[N],m,q;
ll fx[N],fy[N],px[N],py[N];
int jg[N];
int main(){
scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
scanf("%d",&m);
fx[0]=fy[0]=1;
for(int i=1;i<=m;i++){
fx[i]=fx[i-1],fy[i]=fy[i-1],px[i]=px[i-1],py[i]=py[i-1],jg[i]=jg[i-1];
int op,p;scanf("%d",&op);
if(op>2) scanf("%d",&p);
else swap(fx[i],fy[i]),swap(px[i],py[i]),jg[i]^=1;
if(op==1) fy[i]=-fy[i],py[i]=-py[i];
else if(op==2) fx[i]=-fx[i],px[i]=-px[i];
else if(op==3) fx[i]=-fx[i],px[i]=2*p-px[i];
else fy[i]=-fy[i],py[i]=2*p-py[i];
}
scanf("%d",&q);while(q--){
int a,b;scanf("%d%d",&a,&b);
if(!jg[a]) printf("%lld %lld\n",fx[a]*x[b]+px[a],fy[a]*y[b]+py[a]);
else printf("%lld %lld\n",fx[a]*y[b]+px[a],fy[a]*x[b]+py[a]);
}
return 0;
}