Codeforces 400(#234 Div2 only) C Inna and Huge Candy Matrix
問題
n行m列のグリッドにp個キャンディが置いてあって、i番目のキャンディはx[i]行y[i]列にある。
このグリッドをx回時計回りに90度、y回水平反転を、z回半時計回りに90度回転させる。
操作の後でそれぞれのキャンディは何行何列にあるか出力せよ。
制約条件
n, m≦10^9
x, y, z≦10^9
p≦10^5
方針
回転は4回やると戻るので4で割った余りを取ればいい。
反転は2回やると戻るので奇数のときだけ1回反転すればいい。
なので座標が変わる回数は高々8回とかそれくらいなので、
それぞれのキャンディごとに愚直に回転すれば間に合う。
反時計回りは時計回りを3回やればいい。
幅W, 高さHのグリッドを時計回りに回転させると、(x, y)は
(H + 1 - y, x)にうつる。で、W, Hが入れ替わる。
ソースコード
void rot(int &h, int &w, int &y, int &x){ int ny = x; int nx = h + 1 - y; y = ny; x = nx; swap(h, w); } int main(){ int h, w, a, b, c, p; cin >> h >> w >> a >> b >> c >> p; a %= 4; b %= 2; c %= 4; while(p--){ int x, y; cin >> y >> x; int th = h, tw = w; rep(it, a) rot(th, tw, y, x); if(b) x = tw + 1 - x; rep(it, 4 - c) rot(th, tw, y, x); cout << y << " " << x << endl; } return 0; }