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;
}