はまやんはまやんはまやん

hamayanhamayan's blog

折り紙 [ICPC2018 国内予選 B]

https://onlinejudge.u-aizu.ac.jp/challenges/sources/ICPC/Prelim/1625

解法

https://onlinejudge.u-aizu.ac.jp/solutions/problem/1625/review/3029479/hamayanhamayan/C++14

シミュレーションを頑張る。
実装方針としては「A[y][x] = 座標(x,y)に何枚重なっているか」を更新しながら実装する。
H,Wが変わっていくが、紙がない部分はA[y][x]=0としておいて、H,Wは変えないようにしておくと少し考えることが減る。
後は頑張って実装。

int W, H, T, P;
int A[2][101][101];
//---------------------------------------------------------------------------------------------------
void _main() {
    while (cin >> W >> H >> T >> P) {
        if (W == 0) return;
        
        rep(t, 0, 2) rep(y, 0, 101) rep(x, 0, 101) A[t][y][x] = 0;
        rep(y, 0, H) rep(x, 0, W) A[0][y][x] = 1;

        rep(t, 0, T) {
            int d, c; cin >> d >> c;
            rep(y, 0, 101) rep(x, 0, 101) A[(t + 1) % 2][y][x] = 0;

            if (d == 1) {
                rep(y, 0, H) rep(x, 0, W) A[(t + 1) % 2][y][x] = A[t % 2][y][x + c];
                rep(x, 0, c) rep(y, 0, H) A[(t + 1) % 2][y][x] += A[t % 2][y][c - 1 - x];
            } else {
                rep(y, 0, H) rep(x, 0, W) A[(t + 1) % 2][y][x] = A[t % 2][y + c][x];
                rep(x, 0, W) rep(y, 0, c) A[(t + 1) % 2][y][x] += A[t % 2][c - 1 - y][x];
            }
        }

        rep(p, 0, P) {
            int x, y; cin >> x >> y;
            printf("%d\n", A[T % 2][y][x]);
        }
    }
}