Submission #1086463

#TimeUsernameProblemLanguageResultExecution timeMemory
1086463vladiliusSeats (IOI18_seats)C++17
11 / 100
4097 ms103504 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define arr3 array<int, 3>

struct ST{
    vector<pii> t;
    int n;
    void init(int ns){
        n = ns;
        t.resize(4 * n);
    }
    void upd(int v, int tl, int tr, int& p, int& x){
        if (tl == tr){
            t[v] = {x, x};
            return;
        }
        int tm = (tl + tr) / 2, vv = 2 * v;
        if (p <= tm){
            upd(vv, tl, tm, p, x);
        }
        else {
            upd(vv + 1, tm + 1, tr, p, x);
        }
        t[v].ff = min(t[vv].ff, t[vv + 1].ff);
        t[v].ss = max(t[vv].ss, t[vv + 1].ss);
    }
    void upd(int p, int x){
        upd(1, 1, n, p, x);
    }
    vector<arr3> all;
    void dec(int v, int tl, int tr, int& l, int& r){
        if (l > tr || r < tl) return;
        if (l <= tl && tr <= r){
            all.pb({v, tl, tr});
            return;
        }
        int tm = (tl + tr) / 2, vv = 2 * v;
        dec(vv, tl, tm, l, r);
        dec(vv + 1, tm + 1, tr, l, r);
    }
    int fn1(int v, int tl, int tr, int& x){
        if (tl == tr) return tl;
        int tm = (tl + tr) / 2, vv = 2 * v;
        if (t[vv].ss > x){
            return fn1(vv, tl, tm, x);
        }
        return fn1(vv + 1, tm + 1, tr, x);
    }
    int find1(int l, int x){
        all.clear();
        dec(1, 1, n, l, n);
        for (auto [v, tl, tr]: all){
            if (t[v].ss > x){
                return fn1(v, tl, tr, x);
            }
        }
        return n + 1;
    }
    int fn2(int v, int tl, int tr, int& x){
        if (tl == tr) return tl;
        int tm = (tl + tr) / 2, vv = 2 * v;
        if (t[vv].ff < x){
            return fn2(vv, tl, tm, x);
        }
        return fn2(vv + 1, tm + 1, tr, x);
    }
    int find2(int l, int x){
        all.clear();
        dec(1, 1, n, l, n);
        for (auto [v, tl, tr]: all){
            if (t[v].ff < x){
                return fn2(v, tl, tr, x);
            }
        }
        return n + 1;
    }
};

vector<int> x, y;
int h, w, k;
ST T1, T2;

void give_initial_chart(int H, int W, vector<int> R, vector<int> C){
    h = H; w = W; k = h * w;
    x.resize(k + 1);
    y.resize(k + 1);
    T1.init(k); T2.init(k);
    for (int i = 1; i <= k; i++){
        x[i] = R[i - 1] + 1;
        y[i] = C[i - 1] + 1;
        T1.upd(i, x[i]);
        T2.upd(i, y[i]);
    }
}

int swap_seats(int a, int b){
    a++; b++;
    T1.upd(a, x[b]);
    T1.upd(b, x[a]);
    swap(x[a], x[b]);
    T2.upd(a, y[b]);
    T2.upd(b, y[a]);
    swap(y[a], y[b]);
    
    if (h <= 1000 && w <= 1000){
        int i = 1, m1 = x[1], m2 = x[1], m3 = y[1], m4 = y[1], out = 0;
        while (true){
            int j1 = T1.find1(i, m1), j2 = T1.find2(i, m2), j3 = T2.find1(i, m3), j4 = T2.find2(i, m4), j = min({j1, j2, j3, j4});
            
            int pr = (m1 - m2 + 1) * (m3 - m4 + 1);
            out += (i <= pr && pr < j);
            if (j > k) break;
            if (j1 == j) m1 = x[j];
            if (j2 == j) m2 = x[j];
            if (j3 == j) m3 = y[j];
            if (j4 == j) m4 = y[j];
            i = j;
        }
        return out;
    }
    else {
        int out = 1, m1 = x[1], m2 = x[1], m3 = y[1], m4 = y[1];
        for (int i = 2; i <= k; i++){
            m1 = min(m1, x[i]); m2 = max(m2, x[i]);
            m3 = min(m3, y[i]); m4 = max(m4, y[i]);
            out += ((m2 - m1 + 1) * (m4 - m3 + 1) == i);
        }
        return out;
    }
}
#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...