답안 #1081667

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1081667 2024-08-30T09:00:01 Z TB_ Pipes (CEOI15_pipes) C++17
40 / 100
767 ms 65536 KB
#include <bits/stdc++.h>

using namespace std;

#define ll int
#define fo(i, n) for(ll i = 0; i<(n); i++)
#define F first 
#define S second
#define pb push_back
#define deb(x) cout << #x << " = " << (x) << endl
#define deb2(x, y) cout << #x << " = " << (x)  << ",  " << #y << " = " << (y) << endl


typedef vector<int> vl;
typedef vector<vl> vvl;


struct UnionFind{
    int n;
    vl p;
    UnionFind(int n){
        p.resize(n);
        fo(i, n) p[i] = i;
    }

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

    bool same(int a, int b){
        return find(a) == find(b);
    }

    void unite(int a, int b){
        a = find(a);
        b = find(b);
        if(rand()%2) swap(a, b);
        p[b] = a;
    }
};


int main(){
    cin.tie(0)->sync_with_stdio(0);

    int n, m, from, to;
    cin >> n >> m;
    vl xorv(n, 0), amount(n, 0), hash(n, 0);
    UnionFind uf(n);
    mt19937 rng(42);
    fo(i, m){
        cin >> from >> to;
        from--; to--;
        if(uf.same(from, to)){
            ll val = rng();
            hash[from]^=val;
            hash[to]^=val;
        }else{
            amount[from]++;
            amount[to]++;
            xorv[from]^=to;
            xorv[to]^=from;
            uf.unite(from, to);
        }
    }

    queue<int> st;

    fo(i, n){
        if(amount[i] == 1) st.push(i);
    }

    while(!st.empty()){
        int pos = st.front();
        st.pop();
        if(!amount[pos]) continue;
        ll edge = xorv[pos];
        // deb2(pos+1, edge+1);
        if(!hash[pos]) cout << pos+1 << " " << edge+1 << "\n";
        amount[pos]--;
        amount[edge]--;
        xorv[pos]^=edge;
        xorv[edge]^=pos;
        hash[edge]^=hash[pos];
        if(amount[edge] == 1) st.push(edge);
    }


    return 0;
}


# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 344 KB Output is correct
2 Correct 2 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 81 ms 5712 KB Output is correct
2 Correct 57 ms 5716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 102 ms 2644 KB Output is correct
2 Correct 126 ms 11700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 166 ms 16548 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 230 ms 21780 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 398 ms 34364 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 539 ms 45392 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 605 ms 56912 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 767 ms 65536 KB Memory limit exceeded
2 Halted 0 ms 0 KB -