답안 #603385

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
603385 2022-07-24T05:53:48 Z 박상훈(#8426) Collapse (JOI18_collapse) C++17
30 / 100
155 ms 35664 KB
#include "collapse.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

vector<int> I[100100], ans;
map<int, int> mp[100100];
int n, m, q;

struct DSU{
    int path[100100], h[100100], ans;
    vector<pair<pair<int, int>, int>> _log;
    void init(int n){_log.clear(); ans = n; for (int i=1;i<=n;i++) path[i] = i, h[i] = 0;}
    int find(int s){
        if (s==path[s]) return s;
        return find(path[s]);
    }
    void merge(int s, int v){
        s = find(s), v = find(v);
        if (s==v){
            _log.emplace_back(make_pair(-1, -1), 0);
            return;
        }
        if (h[s] > h[v]) swap(s, v);

        path[s] = v;
        if (h[s]==h[v]){
            _log.emplace_back(make_pair(s, v), 1);
            h[v]++;
        }
        else{
            _log.emplace_back(make_pair(s, v), 0);
        }
        ans--;
    }
    void rollback(){
        assert(!_log.empty());
        auto [p, val] = _log.back(); _log.pop_back();
        if (p.first==-1) return;
        path[p.first] = p.first;
        ans++;
        if (val==1) h[p.second]--;
    }
}dsu;

struct Seg{
    vector<pair<int, int>> tree[400400];
    void update(int i, int l, int r, int s, int e, int x, int y){
        if (r<s || e<l) return;
        if (s<=l && r<=e){
            tree[i].emplace_back(x, y);
            return;
        }
        int m = (l+r)>>1;
        update(i<<1, l, m, s, e, x, y);
        update(i<<1|1, m+1, r, s, e, x, y);
    }

    void dfs(int i, int l, int r){
        for (auto &[x, y]:tree[i]) dsu.merge(x, y);

        if (l==r){
            for (auto &idx:I[l]) ans[idx] = dsu.ans;
            //if (l==m-1) printf("%d %d\n", dsu.find(0)==dsu.find(1), dsu.find(2)==dsu.find(4));
        }
        else{
            int m = (l+r)>>1;
            dfs(i<<1, l, m); dfs(i<<1|1, m+1, r);
        }

        for (auto &[x, y]:tree[i]) dsu.rollback();
    }
}tree;

void solve(
	int N,
	std::vector<int> T,
	std::vector<int> X,
	std::vector<int> Y,
	std::vector<int> W,
	std::vector<int> P
) {
    n = N, m = T.size(), q = W.size();
    //ans.resize(q);
    dsu.init(n);

    for (int i=0;i<m;i++){

        if (X[i] > Y[i]) swap(X[i], Y[i]);
        if (X[i] <= P[0] && P[0]+1 <= Y[i]) continue;

        if (T[i]==0){
            mp[X[i]][Y[i]] = i;
        }
        else{
            tree.update(1, 0, m-1, mp[X[i]][Y[i]], i-1, X[i], Y[i]);
            mp[X[i]][Y[i]] = -1;
        }
    }

    for (int i=0;i<=n;i++){
        for (auto &[y, t]:mp[i]) if (t!=-1) tree.update(1, 0, m-1, t, m-1, i, y);
    }

    for (int i=0;i<q;i++){
        I[W[i]].push_back(i);
    }
    tree.dfs(1, 0, m-1);

    //return ans;
}

std::vector<int> simulateCollapse(
	int N,
	std::vector<int> T,
	std::vector<int> X,
	std::vector<int> Y,
	std::vector<int> W,
	std::vector<int> P
) {
    ans.resize(W.size());
    solve(N, T, X, Y, W, P);
    return ans;

}

Compilation message

collapse.cpp: In member function 'void Seg::dfs(int, int, int)':
collapse.cpp:72:20: warning: unused structured binding declaration [-Wunused-variable]
   72 |         for (auto &[x, y]:tree[i]) dsu.rollback();
      |                    ^~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 17236 KB Output is correct
2 Incorrect 10 ms 16952 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 20108 KB Output is correct
2 Correct 31 ms 20108 KB Output is correct
3 Correct 81 ms 28564 KB Output is correct
4 Correct 30 ms 20308 KB Output is correct
5 Correct 97 ms 29516 KB Output is correct
6 Correct 37 ms 20932 KB Output is correct
7 Correct 120 ms 35180 KB Output is correct
8 Correct 102 ms 30800 KB Output is correct
9 Correct 33 ms 20808 KB Output is correct
10 Correct 34 ms 20760 KB Output is correct
11 Correct 36 ms 21076 KB Output is correct
12 Correct 115 ms 32384 KB Output is correct
13 Correct 144 ms 34652 KB Output is correct
14 Correct 155 ms 35664 KB Output is correct
15 Correct 124 ms 35480 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 20044 KB Output is correct
2 Incorrect 33 ms 19988 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 17236 KB Output is correct
2 Incorrect 10 ms 16952 KB Output isn't correct
3 Halted 0 ms 0 KB -