#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 100'001;
const int INF = 1e9;
vector<int> g[MAXN], g2[MAXN];
bool vis[MAXN][4], vis2[MAXN];
int tout[MAXN], timer = 1;
void dfs(int u) {
vis2[u] = 1;
for (int v : g[u]) {
if (!vis2[v]) dfs(v);
}
tout[u] = timer++;
}
void dfs_g1(int u, int type) {
assert(0 <= type && type <= 3);
vis[u][type] = 1;
for (int v : g[u]) {
if (!vis[v][type]) dfs_g1(v, type);
}
}
void dfs_g2(int u, int type) {
assert(0 <= type && type <= 3);
vis[u][type] = 1;
for (int v : g2[u]) {
if (!vis[v][type]) dfs_g2(v, type);
}
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m, a, b; cin >> n >> m >> a >> b;
for (int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
g[u].emplace_back(v);
g2[v].emplace_back(u);
}
dfs_g1(a, 0);
dfs_g2(a, 1);
dfs_g1(b, 2);
dfs_g2(b, 3);
// 0 a -> u
// 1 u -> a
// 2 b -> u
// 3 u -> b
vector<int> ans;
int cnt1 = 0, cnt2 = 0, cnt3 = 0, cnt12 = 0, cnt23 = 0, cnt123 = 0;
vector<int> c1, c2, c3, c12, c23, c123;
for (int j = 1; j <= n; j++) {
if (j == a || j == b) continue;
if (vis[j][1]) {
cnt1++;
c1.emplace_back(j);
}
else if (vis[j][3] && vis[j][0]) {
cnt2++;
c2.emplace_back(j);
}
else if (vis[j][2]) {
cnt3++;
c3.emplace_back(j);
}
else if (vis[j][0]) {
cnt23++;
c23.emplace_back(j);
}
else if (vis[j][3]) {
cnt12++;
c12.emplace_back(j);
}
else {
cnt123++;
c123.emplace_back(j);
}
}
for (int i = 1; i <= n; i++) {
if (!vis2[i]) dfs(i);
}
auto str = [&](vector<int> &todo) {
sort(todo.begin(), todo.end(), [&](int u, int v){
return tout[u] < tout[v];
});
};
str(c1);
str(c2);
str(c3);
str(c12);
str(c23);
str(c123);
int ans1 = 0, ans2 = 0, ans3 = INF, a1f12 = 0, a2f23 = 0, a1f123 = 0, a2f123 = 0;
for (int i = 0; i <= cnt12; i++) {
int x = cnt1 + i;
int y = cnt2 + (cnt12 - i);
int z = cnt3;
int u1f12 = i, u2f23 = 0;
int left23 = cnt23;
if (y < z) {
int used = min(z-y, left23);
left23 -= used;
y += used;
u2f23 += used;
} else {
int used = min(y-z, left23);
left23 -= used;
z += used;
}
if (left23) {
int used1 = left23 / 2;
int used2 = (left23 + 1) / 2;
assert(used1 + used2 == left23);
y += used1;
z += used2;
u2f23 += used1;
}
int ox = x, oy = y, oz = z;
int left123 = cnt123;
while (left123) {
if (x < y && x < z) {
int mx = min(y-x, z-x);
int used = min(left123, mx);
x += used;
left123 -= used;
} else if (y < x && y < z) {
int mx = min(x-y, z-y);
int used = min(left123, mx);
y += used;
left123 -= used;
} else if (z < x && z < y) {
int mx = min(x-z, y-z);
int used = min(left123, mx);
z += used;
left123 -= used;
} else if (x == y && y == z) {
int used1 = left123 / 3;
int used2 = left123 / 3;
int used3 = left123 / 3;
int tot = used1 + used2 + used3;
if (tot + 1 == left123) used1++;
else if (tot + 2 == left123) {
used1++;
used2++;
}
x += used1;
y += used2;
z += used3;
left123 = 0;
} else {
if (left123 == 1) {
if (x == y) x++;
else if (x == z) x++;
else y++;
break;
} else if (x == y) {
int mx = z-x;
int used = min(mx, left123/2);
x += used;
y += used;
left123 -= 2*used;
} else if (x == z) {
int mx = y-x;
int used = min(mx, left123/2);
x += used;
z += used;
left123 -= 2*used;
} else if (y == z) {
int mx = x-y;
int used = min(mx, left123/2);
y += used;
z += used;
left123 -= 2*used;
} else throw 1;
}
}
int u1f123 = x-ox;
int u2f123 = y-oy;
if (max({ans1, ans2, ans3}) - min({ans1, ans2, ans3}) > max({x, y, z}) - min({x, y, z})) {
ans1 = x;
ans2 = y;
ans3 = z;
a1f12 = u1f12;
a2f23 = u2f23;
a1f123 = u1f123;
a2f123 = u2f123;
}
}
cout << ans1 << " " << ans2 << " " << ans3 << "\n";
vector<int> comp1, comp2, comp3;
int a2f12 = cnt12 - a1f12;
int a3f23 = cnt23 - a2f23;
int a3f123 = cnt123 - a1f123 - a2f123;
auto work = [](int cnt, vector<int> &from, vector<int> &to) {
for (int i = 0; i < cnt; i++) {
to.emplace_back(from.back());
from.pop_back();
}
};
work(cnt1, c1, comp1);
work(a1f12, c12, comp1);
work(a1f123, c123, comp1);
work(cnt2, c2, comp2);
work(a2f12, c12, comp2);
work(a2f23, c23, comp2);
work(a2f123, c123, comp2);
work(a3f23, c23, comp3);
work(cnt3, c3, comp3);
work(a3f123, c123, comp3);
for (auto vec : {c1, c2, c3, c12, c23, c123}) {
assert(vec.empty());
}
auto st = [&](vector<int> &todo) {
sort(todo.begin(), todo.end(), [&](int u, int v){
return tout[u] > tout[v];
});
};
st(comp1);
st(comp2);
st(comp3);
assert(comp1.size() == ans1);
assert(comp2.size() == ans2);
assert(comp3.size() == ans3);
vector<int> res;
for (int i : comp1) res.emplace_back(i);
res.emplace_back(a);
for (int i : comp2) res.emplace_back(i);
res.emplace_back(b);
for (int i : comp3) res.emplace_back(i);
vector<int> idx(n+1);
for (int i = 0; i < n; i++) {
idx[res[i]] = i;
}
vector<bool> done(n+1);
for (int i = 0; i < n; i++) {
while (!g2[res[i]].empty()) {
int j = g2[res[i]].back();
g2[res[i]].pop_back();
if (!done[j]) {
int b1 = res[i];
int b2 = j;
swap(res[idx[b1]], res[idx[b2]]);
swap(idx[b1], idx[b2]);
break;
}
}
done[res[i]] = 1;
}
// assert(ok);
for (int i : res) cout << i << " ";
// cerr << cnt1 << " " << cnt2 << " " << cnt3 << " " << cnt12 << " " << cnt23 << " " << cnt123 << endl;
}| Részfeladat | Összpont | Teszt | Verdikt | Idő | Memória | ||
|---|---|---|---|---|---|---|---|
| subtask1 | 0/0 | ||||||
| 1 | Elfogadva | 4ms | 4916 KiB | ||||
| 2 | Elfogadva | 78ms | 11956 KiB | ||||
| subtask2 | 15/15 | ||||||
| 3 | Elfogadva | 7ms | 5172 KiB | ||||
| 4 | Elfogadva | 8ms | 5172 KiB | ||||
| 5 | Elfogadva | 10ms | 5428 KiB | ||||
| 6 | Elfogadva | 24ms | 6452 KiB | ||||
| 7 | Elfogadva | 41ms | 7948 KiB | ||||
| 8 | Elfogadva | 65ms | 9744 KiB | ||||
| 9 | Elfogadva | 90ms | 11184 KiB | ||||
| 10 | Elfogadva | 181ms | 18200 KiB | ||||
| 11 | Elfogadva | 273ms | 20528 KiB | ||||
| 12 | Elfogadva | 273ms | 20392 KiB | ||||
| subtask3 | 15/15 | ||||||
| 13 | Elfogadva | 4ms | 4920 KiB | ||||
| 14 | Elfogadva | 6ms | 4916 KiB | ||||
| 15 | Elfogadva | 4ms | 5108 KiB | ||||
| 16 | Elfogadva | 6ms | 4916 KiB | ||||
| 17 | Elfogadva | 4ms | 4916 KiB | ||||
| 18 | Elfogadva | 4ms | 5044 KiB | ||||
| 19 | Elfogadva | 6ms | 5128 KiB | ||||
| 20 | Elfogadva | 4ms | 5132 KiB | ||||
| 21 | Elfogadva | 4ms | 4916 KiB | ||||
| 22 | Elfogadva | 6ms | 4928 KiB | ||||
| 23 | Elfogadva | 4ms | 5124 KiB | ||||
| 24 | Elfogadva | 6ms | 4916 KiB | ||||
| 25 | Elfogadva | 4ms | 4948 KiB | ||||
| 26 | Elfogadva | 6ms | 5172 KiB | ||||
| 27 | Elfogadva | 4ms | 5108 KiB | ||||
| 28 | Elfogadva | 6ms | 5048 KiB | ||||
| 29 | Elfogadva | 4ms | 4916 KiB | ||||
| 30 | Elfogadva | 6ms | 4980 KiB | ||||
| 31 | Elfogadva | 6ms | 4916 KiB | ||||
| subtask4 | 15/15 | ||||||
| 32 | Elfogadva | 4ms | 4920 KiB | ||||
| 33 | Elfogadva | 6ms | 4916 KiB | ||||
| 34 | Elfogadva | 4ms | 5108 KiB | ||||
| 35 | Elfogadva | 6ms | 4916 KiB | ||||
| 36 | Elfogadva | 4ms | 4916 KiB | ||||
| 37 | Elfogadva | 4ms | 5044 KiB | ||||
| 38 | Elfogadva | 6ms | 5128 KiB | ||||
| 39 | Elfogadva | 4ms | 5132 KiB | ||||
| 40 | Elfogadva | 4ms | 4916 KiB | ||||
| 41 | Elfogadva | 6ms | 4928 KiB | ||||
| 42 | Elfogadva | 4ms | 5124 KiB | ||||
| 43 | Elfogadva | 6ms | 4916 KiB | ||||
| 44 | Elfogadva | 4ms | 4948 KiB | ||||
| 45 | Elfogadva | 6ms | 5172 KiB | ||||
| 46 | Elfogadva | 4ms | 5108 KiB | ||||
| 47 | Elfogadva | 10ms | 5684 KiB | ||||
| 48 | Elfogadva | 10ms | 5684 KiB | ||||
| 49 | Elfogadva | 13ms | 5944 KiB | ||||
| 50 | Elfogadva | 14ms | 5940 KiB | ||||
| 51 | Elfogadva | 13ms | 5920 KiB | ||||
| 52 | Elfogadva | 13ms | 5940 KiB | ||||
| 53 | Elfogadva | 13ms | 5952 KiB | ||||
| 54 | Elfogadva | 10ms | 5684 KiB | ||||
| 55 | Elfogadva | 9ms | 5684 KiB | ||||
| 56 | Elfogadva | 8ms | 5428 KiB | ||||
| 57 | Elfogadva | 6ms | 5048 KiB | ||||
| 58 | Elfogadva | 4ms | 4916 KiB | ||||
| 59 | Elfogadva | 6ms | 4980 KiB | ||||
| 60 | Elfogadva | 6ms | 4916 KiB | ||||
| subtask5 | 15/15 | ||||||
| 61 | Elfogadva | 4ms | 4916 KiB | ||||
| 62 | Elfogadva | 6ms | 4928 KiB | ||||
| 63 | Elfogadva | 10ms | 5684 KiB | ||||
| 64 | Elfogadva | 14ms | 5940 KiB | ||||
| 65 | Elfogadva | 13ms | 5920 KiB | ||||
| 66 | Elfogadva | 92ms | 13396 KiB | ||||
| 67 | Elfogadva | 86ms | 13036 KiB | ||||
| 68 | Elfogadva | 90ms | 12460 KiB | ||||
| 69 | Elfogadva | 93ms | 12812 KiB | ||||
| 70 | Elfogadva | 68ms | 11436 KiB | ||||
| 71 | Elfogadva | 97ms | 13992 KiB | ||||
| 72 | Elfogadva | 101ms | 12848 KiB | ||||
| 73 | Elfogadva | 118ms | 14060 KiB | ||||
| 74 | Elfogadva | 71ms | 11692 KiB | ||||
| 75 | Elfogadva | 90ms | 13456 KiB | ||||
| 76 | Elfogadva | 57ms | 9916 KiB | ||||
| 77 | Elfogadva | 103ms | 13064 KiB | ||||
| 78 | Elfogadva | 119ms | 13996 KiB | ||||
| 79 | Elfogadva | 94ms | 14252 KiB | ||||
| 80 | Elfogadva | 231ms | 21932 KiB | ||||
| 81 | Elfogadva | 6ms | 5048 KiB | ||||
| 82 | Elfogadva | 4ms | 4916 KiB | ||||
| subtask6 | 40/40 | ||||||
| 83 | Elfogadva | 4ms | 5108 KiB | ||||
| 84 | Elfogadva | 103ms | 11948 KiB | ||||
| 85 | Elfogadva | 4ms | 4920 KiB | ||||
| 86 | Elfogadva | 6ms | 4916 KiB | ||||
| 87 | Elfogadva | 4ms | 5108 KiB | ||||
| 88 | Elfogadva | 6ms | 4916 KiB | ||||
| 89 | Elfogadva | 4ms | 4916 KiB | ||||
| 90 | Elfogadva | 4ms | 5044 KiB | ||||
| 91 | Elfogadva | 6ms | 5128 KiB | ||||
| 92 | Elfogadva | 4ms | 5132 KiB | ||||
| 93 | Elfogadva | 4ms | 4916 KiB | ||||
| 94 | Elfogadva | 6ms | 4928 KiB | ||||
| 95 | Elfogadva | 4ms | 5124 KiB | ||||
| 96 | Elfogadva | 6ms | 4916 KiB | ||||
| 97 | Elfogadva | 4ms | 4948 KiB | ||||
| 98 | Elfogadva | 6ms | 5172 KiB | ||||
| 99 | Elfogadva | 4ms | 5108 KiB | ||||
| 100 | Elfogadva | 10ms | 5684 KiB | ||||
| 101 | Elfogadva | 10ms | 5684 KiB | ||||
| 102 | Elfogadva | 13ms | 5944 KiB | ||||
| 103 | Elfogadva | 14ms | 5940 KiB | ||||
| 104 | Elfogadva | 13ms | 5920 KiB | ||||
| 105 | Elfogadva | 13ms | 5940 KiB | ||||
| 106 | Elfogadva | 13ms | 5952 KiB | ||||
| 107 | Elfogadva | 10ms | 5684 KiB | ||||
| 108 | Elfogadva | 9ms | 5684 KiB | ||||
| 109 | Elfogadva | 8ms | 5428 KiB | ||||
| 110 | Elfogadva | 92ms | 13396 KiB | ||||
| 111 | Elfogadva | 41ms | 8624 KiB | ||||
| 112 | Elfogadva | 86ms | 13036 KiB | ||||
| 113 | Elfogadva | 90ms | 12460 KiB | ||||
| 114 | Elfogadva | 93ms | 12812 KiB | ||||
| 115 | Elfogadva | 68ms | 11436 KiB | ||||
| 116 | Elfogadva | 97ms | 13992 KiB | ||||
| 117 | Elfogadva | 101ms | 12848 KiB | ||||
| 118 | Elfogadva | 118ms | 14060 KiB | ||||
| 119 | Elfogadva | 71ms | 11692 KiB | ||||
| 120 | Elfogadva | 90ms | 13456 KiB | ||||
| 121 | Elfogadva | 57ms | 9916 KiB | ||||
| 122 | Elfogadva | 103ms | 13064 KiB | ||||
| 123 | Elfogadva | 114ms | 13520 KiB | ||||
| 124 | Elfogadva | 93ms | 13848 KiB | ||||
| 125 | Elfogadva | 93ms | 13484 KiB | ||||
| 126 | Elfogadva | 37ms | 8368 KiB | ||||
| 127 | Elfogadva | 74ms | 11244 KiB | ||||
| 128 | Elfogadva | 76ms | 12416 KiB | ||||
| 129 | Elfogadva | 71ms | 11248 KiB | ||||
| 130 | Elfogadva | 94ms | 13636 KiB | ||||
| 131 | Elfogadva | 65ms | 11252 KiB | ||||
| 132 | Elfogadva | 90ms | 12716 KiB | ||||
| 133 | Elfogadva | 119ms | 14252 KiB | ||||
| 134 | Elfogadva | 93ms | 13484 KiB | ||||
| 135 | Elfogadva | 79ms | 12460 KiB | ||||
| 136 | Elfogadva | 119ms | 13996 KiB | ||||
| 137 | Elfogadva | 116ms | 14252 KiB | ||||
| 138 | Elfogadva | 70ms | 11400 KiB | ||||
| 139 | Elfogadva | 90ms | 13236 KiB | ||||
| 140 | Elfogadva | 108ms | 13904 KiB | ||||
| 141 | Elfogadva | 115ms | 13996 KiB | ||||
| 142 | Elfogadva | 86ms | 13188 KiB | ||||
| 143 | Elfogadva | 94ms | 14252 KiB | ||||
| 144 | Elfogadva | 231ms | 21932 KiB | ||||
| 145 | Elfogadva | 7ms | 5172 KiB | ||||
| 146 | Elfogadva | 8ms | 5172 KiB | ||||
| 147 | Elfogadva | 10ms | 5428 KiB | ||||
| 148 | Elfogadva | 24ms | 6452 KiB | ||||
| 149 | Elfogadva | 41ms | 7948 KiB | ||||
| 150 | Elfogadva | 65ms | 9744 KiB | ||||
| 151 | Elfogadva | 90ms | 11184 KiB | ||||
| 152 | Elfogadva | 181ms | 18200 KiB | ||||
| 153 | Elfogadva | 273ms | 20528 KiB | ||||
| 154 | Elfogadva | 273ms | 20392 KiB | ||||
| 155 | Elfogadva | 6ms | 5048 KiB | ||||
| 156 | Elfogadva | 4ms | 4916 KiB | ||||
| 157 | Elfogadva | 6ms | 4980 KiB | ||||
| 158 | Elfogadva | 6ms | 4916 KiB | ||||