kmjp's blog

競技プログラミング参加記です

Codeforces #234 Div2. C. Inna and Huge Candy Matrix

CF#234は不参加のため、後日復習。
少し手こずったけど何とか自力で全問正答。
http://codeforces.com/contest/400/problem/C

問題

NxMのグリッドのうち、いくつか飴が置かれたマスがある。
これらのグリッドに対し、A回90度右回転し、B回左右反転し、C回90度左回転した後の飴の位置を答えよ。

解法

A,B,Cの上限は大きいが、回転は4回、反転は2回行うとループする点を考えれば、結局それぞれの実行回数は3回以内で良い。
後は地道に実装するだけ。

ll R,C,P;
ll X[100001],Y[100001];

void solve() {
	int f,i,j,k,l,a,b,c,x,y;
	
	cin>>R>>C>>a>>b>>c>>P;
	FOR(i,P) cin>>Y[i]>>X[i];
	
	FOR(i,P) {
		x=X[i],y=Y[i];
		if(a%4==2) Y[i]=R+1-y,X[i]=C+1-x;
		if(a%4==3) Y[i]=C+1-x,X[i]=y;
		if(a%4==1) Y[i]=x,X[i]=R+1-y;
	}
	if(a%2==1) swap(R,C);
	
	FOR(i,P) if(b%2) X[i]=C+1-X[i];
	
	FOR(i,P) {
		x=X[i],y=Y[i];
		if(c%4==2) Y[i]=R+1-y,X[i]=C+1-x;
		if(c%4==1) Y[i]=C+1-x,X[i]=y;
		if(c%4==3) Y[i]=x,X[i]=R+1-y;
		
		_P("%lld %lld\n",Y[i],X[i]);
	}
}

まとめ

面倒ではあるが、Div2とはいえ簡単過ぎないか?
この問題はDiv2 Bでもいいと思う。