QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#949543#9038. Basic Graph AlgorithmhxsjWA 1ms3584kbC++142.8kb2025-03-24 01:29:392025-03-24 01:29:40

Judging History

This is the latest submission verdict.

  • [2025-03-24 01:29:40]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 3584kb
  • [2025-03-24 01:29:39]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
//using i128 = __int128;
#define sz(a) (int)(a.size())
#define rep(x,a,b) for(int x = a; x < b; x++)
#define all(a) a.begin(), a.end()
#define uni(a) a.resize(unique(all(a)) - a.begin())
#define maxe(a) max_element(all(a))
#define mine(a) min_element(all(a))
#define lb(b,val) lower_bound(b.begin(), b.end(), val) - b.begin()
#define ub(b,val) upper_bound(b.begin(), b.end(), val) - b.begin()
#define fd(b,val) find(all(b), val) - b.begin()
#define ct(b,val) count(all(b), val)
#define bp(s) __builtin_popcountll(s)
#define fi first 
#define se second
#define pb push_back
#define eb emplace_back
#define endl "\n"
#define sp setprecision
const int mod = 1e9 + 7;
struct DSU{
    vector<int> f, siz;
    DSU(int n) : f(n), siz(n, 1)
    {
        iota(f.begin(), f.end(), 0);
    }
    int find(int x)
    {
        return x == f[x] ? x : f[x] = find(f[x]);
    }
    bool same(int x, int y)
    {
        return find(x) == find(y);
    }
    void merge(int x, int y)
    {
        x = find(x), y = find(y);
        if (x != y)
        {
            siz[x] += siz[y];
            f[y] = x;
        }
    }
    int size(int x)
    {
        return siz[find(x)];
    }
};
void solve(){
    int n, m, u, v;
    cin >> n >> m;
    vector<int> p(n + 1), st(n + 1), a(n + 1), id(n + 1);
    set<int> g[n + 1];
    DSU dsu(n + 1);
    vector<array<int, 2>> res, ed(m + 1);
    rep(i, 1, m + 1){
        cin >> ed[i][0] >> ed[i][1];
    }
    for(int i = 1; i <= n; i++){
        cin >> p[i];
        a[p[i]] = i;
        id[i] = p[i];
    }
    rep(i, 1, m + 1){
        u = ed[i][0];
        v = ed[i][1];
        g[a[u]].insert(a[v]);
        g[a[v]].insert(a[u]);
        dsu.merge(a[u], a[v]);
    }
    int idx = 1;
    int now = 0;
    function<void(int, int)> dfs = [&](int u, int f){
        st[u] = 1;
        now++;
        if(idx > n) return;
        if(idx == u) idx++;
        for(auto v : g[u]){
            if(st[v]) continue;
            if(v == idx){
                dfs(v, u);         
            }      
            else{
                res.pb({id[u], id[idx]});
                idx++;
                dfs(idx - 1, u);
            } 
        }
        if(idx <= n && now != dsu.size(u)){
            res.pb({id[u], id[idx]});        
            dsu.merge(idx, u);
            dfs(idx, u);            
        }
    };
    rep(i, 1, n + 1){
        now = 0;
        if(!st[i]) dfs(i, 0);
    }
    cout << sz(res) << endl;
    for(auto [x, y] : res) cout << x << " " << y << endl;
}
signed main(){
    int _ = 1;
    ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
    while(_--){
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3584kb

input:

6 6
1 3
1 4
2 3
3 4
3 6
5 6
1 2 3 4 5 6

output:

2
1 2
4 5

result:

ok 

Test #2:

score: 0
Accepted
time: 1ms
memory: 3584kb

input:

8 8
2 8
3 8
5 6
1 6
6 3
8 7
2 3
4 3
1 8 7 5 4 2 3 6

output:

4
1 8
7 5
5 4
4 2

result:

ok 

Test #3:

score: 0
Accepted
time: 0ms
memory: 3584kb

input:

1 0
1

output:

0

result:

ok 

Test #4:

score: -100
Wrong Answer
time: 1ms
memory: 3584kb

input:

10 5
3 6
1 2
3 2
6 1
9 4
10 2 9 3 8 5 4 1 7 6

output:

8
2 9
9 3
3 8
8 5
5 4
4 1
1 7
7 6

result:

wrong answer Contestant's answer is larger than Jury's answer