QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#949545 | #9038. Basic Graph Algorithm | hxsj | WA | 1ms | 3712kb | C++14 | 2.8kb | 2025-03-24 01:32:34 | 2025-03-24 01:32:36 |
Judging History
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: 3712kb
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: 0
Accepted
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:
7 2 9 9 3 3 8 8 5 5 4 4 1 1 7
result:
ok
Test #5:
score: -100
Wrong Answer
time: 0ms
memory: 3584kb
input:
10 20 10 1 5 7 1 2 5 3 6 3 9 4 3 4 9 6 8 4 9 6 8 7 3 8 10 7 2 7 3 7 5 9 7 6 4 6 2 10 8 9 2 6 9 5 4 10 3 8 1 7
output:
6 2 6 5 4 4 10 10 3 8 1 8 7
result:
wrong answer Contestant's answer is larger than Jury's answer