답안 #251202

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251202 2020-07-20T15:06:12 Z Sorting Pipes (CEOI15_pipes) C++14
0 / 100
3300 ms 65536 KB
#include <bits/stdc++.h>

using namespace std;

const int k_M = 6e6 + 3;
const int k_N = 1e5 + 3;
const int k_LOG_N = 20;

int n, m;
vector<pair<int, int>> adj[k_N];

vector<pair<int, int>> edges;

int p[k_N], root[k_N], suffix[k_N];
int up[k_LOG_N][k_N], d[k_N];
vector<int> nodes[k_N];

bool not_critical[k_N];

int find_p(int x){
    if(x == p[x]) return x;
    return p[x] = find_p(p[x]);
}

int dfs(int x, int parent = -1){
    int sum = 0;
    for(auto [to, idx]: adj[x]){
        if(to == parent) continue;

        int curr = dfs(to, x);
        if(curr) not_critical[idx] = true;
        sum += curr;
    }

    return sum += suffix[x];
}

void dfs_join(int x, int parent){
    up[0][x] = parent;

    for(auto [to, idx]: adj[x]){
        if(to == parent) continue;
        dfs_join(to, x);
    }
}

bool unite(int x, int y){
    if(find_p(x) == find_p(y)) return false;
    if(nodes[p[x]].size() < nodes[p[y]].size()) swap(x, y);

    dfs(root[p[y]]);
    dfs_join(y, x);

    for(int i = 1; i < k_LOG_N; ++i)
        for(int node: nodes[p[y]])
            up[i][node] = up[i - 1][up[i - 1][node]];

    for(int node: nodes[p[y]])
        nodes[p[x]].push_back(node);
    p[p[y]] = p[x];
    return true;
}

int get_lca(int u, int v){
    if(d[u] < d[v]) swap(u, v);

    int diff = d[u] - d[v];
    if(diff){
        for(int i = k_LOG_N - 1; i >= 0; --i){
            if(diff & (1 << i)){
                u = up[i][u];
            }
        }
    }

    if(u == v) return u;

    for(int i = k_LOG_N - 1; i >= 0; --i){
        if(up[i][u] != up[i][v]){
            u = up[i][u];
            v = up[i][v];
        }
    }

    return up[0][u];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n >> m;

    for(int i = 1; i <= n; ++i){
        p[i] = i;
        nodes[i].push_back(i);
        root[i] = i;
        suffix[i] = 0;
        d[i] = 0;

        //for(int j = 0; j < k_LOG_N; ++j)
        //    up[j][i] = i;
    }

    for(int i = 0; i < m; ++i){
        int u, v;
        cin >> u >> v;

        if(unite(u, v)){
            edges.push_back({u, v});
            adj[u].push_back({v, edges.size() - 1});
            adj[v].push_back({u, edges.size() - 1});
        }
        else{
            int lca = get_lca(u, v);
            suffix[lca] -= 2;
            suffix[u]++;
            suffix[v]++;
        }
    }

    for(int i = 1; i <= n; ++i)
        if(i == find_p(i))
            dfs(root[i]);

    for(int i = 0; i < edges.size(); ++i)
        if(!not_critical[i])
            cout << edges[i].first << " " << edges[i].second << "\n";
}

Compilation message

pipes.cpp: In function 'int dfs(int, int)':
pipes.cpp:27:14: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     for(auto [to, idx]: adj[x]){
              ^
pipes.cpp: In function 'void dfs_join(int, int)':
pipes.cpp:41:14: warning: decomposition declaration only available with -std=c++1z or -std=gnu++1z
     for(auto [to, idx]: adj[x]){
              ^
pipes.cpp:41:22: warning: unused variable 'idx' [-Wunused-variable]
     for(auto [to, idx]: adj[x]){
                      ^
pipes.cpp: In function 'int main()':
pipes.cpp:126:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < edges.size(); ++i)
                    ~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 5120 KB Output is correct
2 Incorrect 4 ms 5120 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 6144 KB Output is correct
2 Incorrect 10 ms 6144 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Correct 167 ms 11192 KB Output is correct
2 Incorrect 160 ms 11128 KB Wrong number of edges
# 결과 실행 시간 메모리 Grader output
1 Runtime error 288 ms 16572 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 517 ms 25732 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 909 ms 38464 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1412 ms 52716 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2063 ms 65536 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2899 ms 65536 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 3300 ms 65536 KB Memory limit exceeded
2 Halted 0 ms 0 KB -