Submission #1291036

#TimeUsernameProblemLanguageResultExecution timeMemory
1291036BlockOGFlood (IOI07_flood)C++20
100 / 100
479 ms31252 KiB
#include <bits/stdc++.h>

// meeeooowwwww mrrowwww :3
// go play vivid/stasis!! now!!!! https://vividstasis.gay

#define fo(i, a, b) for (auto i = (a); i < (b); i++)
#define of(i, a, b) for (auto i = (b); i-- > (a);)
#define f first
#define s second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define be(a) a.begin(), a.end()
using namespace std;

int ____init = []{
    ios::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);
    return 0;
}();

pair<int, int> p[100000];
int pe[100000][4];
int dsu[400000];
vector<int> dsd[400000];

map<int, pair<int, int>> comps;
int dsudsu[400000];

int get(int i) {
    if (i < 0 || dsu[i] == i) return i;
    return dsu[i] = get(dsu[i]);
}

int get_dsu(int i) {
    if (dsudsu[i] == i) return i;
    return dsudsu[i] = get_dsu(dsudsu[i]);
}

void merge(int i, int j) {
    i = get(i), j = get(j);
    if (i == j) return;

    if (dsd[i].size() < dsd[j].size()) swap(i, j);
    for (int k : dsd[j]) dsd[i].pb(k);
    dsd[j].clear();
    dsu[j] = i;
}

void merge_dsu(int i, int j) {
    i = get_dsu(i), j = get_dsu(j);
    if (i == j) return;
    
    if (comps[j].s < comps[i].s) comps[i] = comps[j];
    comps.erase(j);
    dsudsu[j] = i;
}

int main() {
    int n; cin >> n;
    fo(i, 0, n) cin >> p[i].f >> p[i].s, pe[i][0] = -1, pe[i][1] = -1, pe[i][2] = -1, pe[i][3] = -1;

    int w; cin >> w;
    fo(i, 0, w) {
        int a, b; cin >> a >> b; a--, b--;
        if (p[a].s == p[b].s) {
            if (p[a].f > p[b].f) swap(a, b);
            pe[a][2] = i*2;
            pe[b][0] = i*2;
            comps[i*2] = {i*2+1, p[a].s};
        } else {
            if (p[a].s > p[b].s) swap(a, b);
            pe[a][3] = i*2;
            pe[b][1] = i*2;
            comps[i*2] = {i*2+1, 2000000};
        }

        dsu[i*2  ] = i*2  ;
        dsu[i*2+1] = i*2+1;
        dsd[i*2  ].pb(i*2+1);
        dsd[i*2+1].pb(i*2  );

        dsudsu[i*2] = dsudsu[i*2+1] = i*2;
    }

    fo(i, 0, n) {
        fo(k, 0, 4) 
            if (pe[i][k] != -1) {
                int j = pe[i][k] + ((k & 1) == (k & 2) / 2);
                fo(l, 1, 5) {
                    int m = (k + l) % 4;
                    if (pe[i][m] != -1) {
                        merge(j, pe[i][m] + ((m & 1) != (m & 2) / 2));
                        merge_dsu(j, pe[i][m] + ((m & 1) != (m & 2) / 2));
                        j = pe[i][m] + ((m & 1) == (m & 2) / 2);
                    }
                }
                
                break;
            }
    }

    set<int> res;

    for (auto [_, mimy] : comps) {
        auto [mi, my] = mimy;
        
        queue<int> q; q.push(get(mi)); dsu[get(mi)] = -1;
        while (q.size()) {
            int i = q.front(); q.pop();

            for (int j : dsd[i]) {
                int k = get(j);
                if (k < 0) {
                    if (k == dsu[i]) res.insert(j / 2);
                    continue;
                }

                dsu[k] = dsu[i] - 1;
                q.push(k);
            }
        }
    }

    cout << res.size() << endl;
    for (int i : res) cout << i + 1 << endl;
}
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...