Submission #1131467

#TimeUsernameProblemLanguageResultExecution timeMemory
1131467vladiliusCollapse (JOI18_collapse)C++20
0 / 100
35 ms22084 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
const int N = 4e5;

struct dsu{
    vector<int> sz, p;
    vector<pair<int&, int>> hist;
    vector<int> sizes;
    int n, cc, cc1;
    void init(int ns){
        n = ns;
        sz.resize(n + 1);
        p.resize(n + 1);
        for (int i = 1; i <= n; i++){
            sz[i] = 1;
            p[i] = i;
        }
        cc = n;
        cc1 = 0;
    }
    int get(int v){
        return (v == p[v]) ? v : get(p[v]);
    }
    void unite(int x, int y){
        x = get(x); y = get(y);
        if (x == y) return;
        if (sz[x] > sz[y]) swap(x, y);
        hist.pb({p[x], p[x]});
        p[x] = y;
        hist.pb({sz[y], sz[y]});
        sz[y] += sz[x];
        hist.pb({cc, cc});
        hist.pb({cc1, cc1});
        cc--; cc1++;
    }
    void check_point(){
        sizes.pb((int) hist.size());
    }
    void roll_back(){
        while (hist.size() != sizes.back()){
            hist.back().ff = hist.back().ss;
            hist.pop_back();
        }
        sizes.pop_back();
    }
};

vector<pii> ed[N];
vector<int> out, qs[N];
int k;
dsu T;

void add(int v, int tl, int tr, int& l, int& r, pii x){
    if (l > tr || r < tl) return;
    if (l <= tl && tr <= r){
        ed[v].pb(x);
        return;
    }
    int tm = (tl + tr) / 2, vv = 2 * v;
    add(vv, tl, tm, l, r, x);
    add(vv + 1, tm + 1, tr, l, r, x);
}

void solve(int v, int tl, int tr){
    T.check_point();
    for (auto [x, y]: ed[v]){
        T.unite(x, y);
    }
    if (tl == tr){
        for (int ii: qs[tl]){
            out[ii] = T.cc;
        }
    }
    else {
        int tm = (tl + tr) / 2, vv = 2 * v;
        solve(vv, tl, tm);
        solve(vv + 1, tm + 1, tr);
    }
    T.roll_back();
}

vector<int> simulateCollapse(int n, vector<int> t, vector<int> x, vector<int> y, vector<int> w, vector<int> p){
    int m = (int) t.size();
    x.insert(x.begin(), 0);
    y.insert(y.begin(), 0);
    t.insert(t.begin(), 0);
    for (int i = 1; i <= m; i++){
        x[i]++; y[i]++;
    }
    int q = (int) w.size();
    for (int i = 0; i < q; i++){
        p[i]++; w[i]++;
    }
    int P = p[0];
    
    map<pii, int> mp;
    for (int i = 1; i <= m; i++){
        if (x[i] > y[i]) swap(x[i], y[i]);
        if (y[i] <= P || x[i] > P){
            if (!t[i]){
                if (mp.find({x[i], y[i]}) == mp.end()){
                    mp[{x[i], y[i]}] = i;
                }
            }
            else {
                add(1, 1, m, mp[{x[i], y[i]}], i, {x[i], y[i]});
                mp.erase({x[i], y[i]});
            }
        }
    }
    for (auto tt: mp){
        add(1, 1, m, tt.ss, m, tt.ff);
    }
    for (int i = 0; i < q; i++) qs[w[i]].pb(i);
    T.init(n);
    out.resize(q);
    solve(1, 1, m);
    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...