Submission #715650

#TimeUsernameProblemLanguageResultExecution timeMemory
715650MakarooniFurniture (JOI20_furniture)C++17
100 / 100
534 ms61156 KiB
#include "bits/stdc++.h"
using namespace std;

#define all(x) x.begin(), x.end()
#define pb(x) push_back(x)
#define endl '\n'
#define sz(x) (int)x.size()
#define mr(x, y) make_pair(x, y)
#define F first
#define S second

const int N = 2e3 + 10;
const int MOD = 1e9 + 7;

int c[N][N], x[N][N], y[N][N], n, m, cnt[N * 2];
priority_queue<pair<int, int>> st, st2;
bool bl[N][N];

int f(int i, int j){
    return (i - 1) * m + j;
}

void upd(int i, int j){
    if(bl[i][j])
        return;
    bl[i][j] = 1;
    cnt[i + j]--;
    if(i - 1 > 0 && !bl[i - 1][j]){
        x[i - 1][j]--;
        st.push(mr(-x[i - 1][j], f(i - 1, j)));
    }
    if(j - 1 > 0 && !bl[i][j - 1]){
        x[i][j - 1]--;
        st.push(mr(-x[i][j - 1], f(i, j - 1)));
    }
    if(i + 1 <= n && !bl[i + 1][j]){
        y[i + 1][j]--;
        st2.push(mr(-y[i + 1][j], f(i + 1, j)));
    }
    if(j + 1 <= m && !bl[i][j + 1]){
        y[i][j + 1]--;
        st2.push(mr(-y[i][j + 1], f(i, j + 1)));
    }
}

int main(){
    ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m;
    bl[1][1] = 1;
    bl[n][m] = 1;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            if(i == j && i == 1)
                continue;
            if(i == n && j == m)
                continue;
            y[i][j] = (i - 1 > 0) + (j - 1 > 0);
            x[i][j] = (i + 1 <= n) + (j + 1 <= m);
            cnt[i + j]++;
            st.push(mr(-x[i][j], f(i, j)));
            st2.push(mr(-y[i][j], f(i, j)));
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> c[i][j];
            if(!c[i][j])
                continue;
            upd(i, j);
        }
    }
    while(min(-st.top().F, -st2.top().F) == 0){
        if(st.top().F == 0){
            int r = st.top().S, t;
            t = r % m;
            if(t == 0)
                t = m;
            st.pop();
            upd(r / m + (t != m), t);
        }
        else{
            int r = st2.top().S, t;
            t = r % m;
            if(t == 0)
                t = m;
            st2.pop();
            upd(r / m + (t != m), t);
        }
    }
    int p, q, Q;
    cin >> Q;
    while(Q--){
        cin >> p >> q;
        if(bl[p][q])
            cout << 1 << endl;
        else if(cnt[p + q] == 1)
            cout << 0 << endl;
        else{
            cout << 1 << endl;
            upd(p, q);
            while(min(-st.top().F, -st2.top().F) == 0){
                if(st.top().F == 0){
                    int r = st.top().S, t;
                    t = r % m;
                    if(t == 0)
                        t = m;
                    st.pop();
                    upd(r / m + (t != m), t);
                }
                else{
                    int r = st2.top().S, t;
                    t = r % m;
                    if(t == 0)
                        t = m;
                    st2.pop();
                    upd(r / m + (t != m), t);
                }
            }
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...