Submission #1255856

#TimeUsernameProblemLanguageResultExecution timeMemory
1255856biank자리 배치 (IOI18_seats)C++20
100 / 100
1381 ms99132 KiB
#include <bits/stdc++.h>

using namespace std;

#define forsn(i, s, n) for (int i = int(s); i < int(n); i++)
#define forn(i, n) forsn(i, 0, n)
#define dforsn(i, s, n) for (int i = int(n) - 1; i >= int(s); i--)
#define dforn(i, n) dforsn(i, 0, n)

#define sz(x) int(x.size())
#define all(x) begin(x), end(x)

using ii = pair<int, int>;
using vi = vector<int>;

#define fst first
#define snd second

#define pb push_back
#define eb emplace_back

const int SZ = 1 << 20;
const int INF = 1e9 + 9;

int mini[2 * SZ], cnt[2 * SZ], lazy[2 * SZ];

void pass(int u) {
    if (u < SZ) {
        lazy[2 * u + 1] += lazy[u];
        lazy[2 * u] += lazy[u];
    }
    mini[u] += lazy[u];
    lazy[u] = 0;
}

void compute(int u) {
    if (mini[2 * u] < mini[2 * u + 1]) {
        mini[u] = mini[2 * u], cnt[u] = cnt[2 * u];
    } else if (mini[2 * u + 1] < mini[2 * u]) {
        mini[u] = mini[2 * u + 1], cnt[u] = cnt[2 * u + 1];
    } else {
        mini[u] = mini[2 * u], cnt[u] = cnt[2 * u] + cnt[2 * u + 1];
    }
}

void update(int s, int e, int v, int l = 0, int r = SZ, int u = 1) {
    pass(u);
    if (e <= l || r <= s) return;
    if (s <= l && r <= e) {
        lazy[u] += v;
        return pass(u);
    }
    int m = (l + r) / 2;
    update(s, e, v, l, m, 2 * u);
    update(s, e, v, m, r, 2 * u + 1);
    compute(u);
}

vector<vi> val;

void change(int i, int j, int delta) {
    vi value = {val[i][j], val[i + 1][j], val[i][j + 1], val[i + 1][j + 1]};
    sort(all(value));
    update(value[0], value[1], delta);
    update(value[2], value[3], delta);
}

vi r, c;

void give_initial_chart(int H, int W, vi R, vi C) {
    r = R, c = C;
    val.assign(H + 2, vi(W + 2, SZ));
    forn(i, H * W) val[R[i] + 1][C[i] + 1] = i;
    forn(i, 2 * SZ) mini[i] = INF, cnt[i] = 0;
    vi delta(SZ + 1, 0);
    forn(i, H + 1) forn(j, W + 1) {
        vi value = {val[i][j], val[i + 1][j], val[i][j + 1], val[i + 1][j + 1]};
        sort(all(value));
        delta[value[0]]++;
        delta[value[1]]--;
        delta[value[2]]++;
        delta[value[3]]--;
    }
    int pref = 0;
    forn(i, H * W) {
        pref += delta[i];
        mini[i + SZ] = pref;
        cnt[i + SZ] = 1;
    }
    dforsn(i, 1, SZ) compute(i);
}

int swap_seats(int a, int b) {
    forn(x, 2) forn(y, 2) {
        change(r[a] + x, c[a] + y, -1);
        change(r[b] + x, c[b] + y, -1);
    }
    swap(r[a], r[b]);
    swap(c[a], c[b]);
    val[r[a] + 1][c[a] + 1] = a;
    val[r[b] + 1][c[b] + 1] = b;
    forn(x, 2) forn(y, 2) {
        change(r[a] + x, c[a] + y, 1);
        change(r[b] + x, c[b] + y, 1);
    }
    assert(mini[1] == 4);
    return cnt[1];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...