QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#598605 | #9424. Stop the Castle 2 | ucup-team5062# | TL | 177ms | 20192kb | C++20 | 5.7kb | 2024-09-28 22:34:21 | 2024-09-28 22:34:21 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
constexpr int inf = (1 << 30) - 1;
vector<int> hopcroft_karp(int L, int R, const vector<int>& G, const vector<int>& start) {
// for (const auto& v : G) {
// for (int x : v) {
// cerr << x << ' ';
// }
// cerr << endl;
// }
vector<int> match(L + R, -1);
vector<int> d(L, inf);
vector<int> que(L);
int que_l = 0, que_r = 0;
while (true) {
ranges::fill(d, inf);
que_l = que_r = 0;
for (int i = 0; i < L; ++i) {
if (match[i] == -1) {
d[i] = 0;
que[que_r++] = i;
}
}
while (que_l != que_r) {
int u = que[que_l++];
for (int e = start[u]; e < start[u + 1]; ++e) {
const int i = G[e];
if (match[i] != -1 && d[match[i]] == inf) {
d[match[i]] = d[u] + 1;
que[que_r++] = match[i];
}
}
}
bool fin = true;
vector<bool> vis(L);
auto dfs = [&](auto&& self, int v) -> bool {
vis[v] = true;
for (int e = start[v]; e < start[v + 1]; ++e) {
const int i = G[e];
if (match[i] == -1 || (d[match[i]] - d[v] == 1 && !vis[match[i]] && self(self, match[i]))) {
match[i] = v;
match[v] = i;
fin = false;
return true;
}
}
return false;
};
for (int i = 0; i < L; ++i) {
if (!vis[i] && match[i] == -1) {
dfs(dfs, i);
}
}
if (fin) break;
}
return match;
}
void solve() {
int N, M, K;
cin >> N >> M >> K;
K = M - K;
map<int, vector<pair<int, int>>> xtoy, ytox;
for (int i = 0; i < N; ++i) {
int x, y;
cin >> x >> y;
xtoy[x].emplace_back(y, i);
ytox[y].emplace_back(x, i);
}
vector<bool> is_target(2 * N);
for (auto &[x, v] : xtoy) {
ranges::sort(v);
for (int i = 1; i < (int)v.size(); ++i) {
is_target[v[i].second + 0] = true;
}
}
for (auto &[y, v] : ytox) {
ranges::sort(v);
for (int i = 1; i < (int)v.size(); ++i) {
is_target[v[i].second + N] = true;
}
}
vector<pair<int, int>> csr_es;
csr_es.reserve(M);
// vector<vector<int>> graph(N);
map<pair<int, int>, int> edges;
vector<int> prevent(2 * N, -1);
vector<int> U(M), V(M);
for (int i = 0; i < M; ++i) {
int a, b;
cin >> a >> b;
int u = -1, v = -1;
if (const auto itr = xtoy.find(a); itr != end(xtoy)) {
const auto vec = itr->second;
const auto itr2 = lower_bound(begin(vec), end(vec), pair(b, -1));
if (itr2 != begin(vec) && itr2 != end(vec)) {
u = itr2->second + 0;
}
}
if (const auto itr = ytox.find(b); itr != end(ytox)) {
const auto vec = itr->second;
const auto itr2 = lower_bound(begin(vec), end(vec), pair(a, -1));
if (itr2 != begin(vec) && itr2 != end(vec)) {
v = itr2->second + N;
}
}
if (u == -1) swap(u, v);
if (u != -1) {
if (v != -1) {
csr_es.push_back(minmax(u, v));
edges[minmax(u, v)] = i;
prevent[u] = i;
prevent[v] = i;
} else {
prevent[u] = i;
}
}
U[i] = u;
V[i] = v;
}
vector<int> start(N + 1);
for (const auto& [u, v] : csr_es) {
start[u] += 1;
}
for (int i = 0; i < N; ++i) {
start[i + 1] += start[i];
}
vector<int> graph(start[N]);
for (const auto& [u, v] : csr_es) {
graph[--start[u]] = v;
}
const auto matching = hopcroft_karp(N, N, graph, start);
vector<int> good;
for (int i = 0; i < N; ++i) {
if (const int j = matching[i]; j != -1) {
const int e = edges[minmax(i, j)];
good.push_back(e);
// cerr << "Yay" << endl;
}
}
if ((int)good.size() > K) {
good.resize(K);
}
vector<bool> prevented(2 * N);
vector<bool> used(M);
for (const int e : good) {
used[e] = true;
for (const int x : {U[e], V[e]}) if (x != -1) {
prevented[x] = true;
}
}
for (int i = 0; i < 2 * N; ++i) {
if (const int e = prevent[i]; !prevented[i] && e != -1 && (int)good.size() < K) {
prevented[i] = true;
used[e] = true;
good.push_back(e);
}
}
int remain = K - (int)good.size();
for (int i = 0; i < M; ++i) {
if (remain > 0 && !used[i]) {
remain -= 1;
used[i] = true;
}
}
int ans = 0;
for (int i = 0; i < 2 * N; ++i) {
if (is_target[i] && !prevented[i]) {
ans += 1;
}
}
cout << ans << '\n';
vector<int> removed;
for (int i = 0; i < M; ++i) {
if (!used[i]) {
removed.push_back(i);
}
}
for (int i = 0; i < (int)removed.size(); ++i) {
cout << removed[i] + 1 << " \n"[i == (int)removed.size() - 1];
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
solve();
}
return 0;
}
/*
1
8 6 4
1 3
2 1
2 6
4 1
4 7
6 1
6 3
6 6
2 3
3 1
4 3
4 6
5 2
6 4
*/
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3540kb
input:
3 8 6 4 1 3 2 1 2 6 4 1 4 7 6 1 6 3 6 6 2 3 3 1 4 3 4 6 5 2 6 4 3 2 1 10 12 10 10 10 11 1 4 1 5 1 3 2 1 1 2 1 2 2 2 3
output:
4 2 3 5 6 2 2 0 2 3
result:
ok ok 3 cases (3 test cases)
Test #2:
score: 0
Accepted
time: 97ms
memory: 5348kb
input:
1224 11 17 14 7 3 4 2 8 13 3 15 3 4 5 11 10 2 3 3 8 6 7 11 2 3 10 4 1 3 12 1 2 5 11 9 11 6 11 10 8 15 1 5 9 14 4 11 1 6 10 7 7 6 11 4 8 4 1 11 18 3 2 14 8 2 14 13 13 9 12 14 12 5 6 8 1 10 5 8 6 8 9 6 6 7 5 12 11 6 11 13 5 1 10 7 6 14 5 6 15 2 4 11 1 1 6 4 14 14 13 9 9 3 10 12 7 5 8 13 9 14 1 9 8 4 9...
output:
7 3 4 5 6 7 8 9 10 11 12 13 15 16 17 15 2 3 0 3 4 5 6 0 2 3 4 5 6 7 8 9 11 1 3 8 1 2 3 0 1 2 3 4 5 6 7 8 9 10 11 12 1 5 6 7 9 10 11 12 8 17 18 19 1 1 2 3 4 5 6 7 8 7 6 8 10 13 14 15 1 10 11 12 13 14 15 16 17 18 19 20 0 1 1 2 3 0 5 6 7 7 8 11 12 13 14 2 10 11 12 13 14 4 3 4 5 6 7 8 1 18 1 4 5 6 7 8 9...
result:
ok ok 1224 cases (1224 test cases)
Test #3:
score: 0
Accepted
time: 120ms
memory: 15520kb
input:
1 86289 95092 40401 911 152 1 270 135 731 347 451 283 224 338 348 166 346 12 385 590 763 939 176 232 405 122 946 397 576 795 823 546 392 33 718 444 598 954 852 185 662 732 539 172 681 386 148 76 495 163 323 711 201 278 363 531 275 66 122 823 983 234 792 102 188 985 423 804 712 419 636 318 331 693 68...
output:
81531 4423 4425 4427 4428 4429 4431 4433 4436 4439 4440 4445 4451 4454 4455 4458 4460 4461 4465 4468 4470 4471 4472 4473 4475 4476 4478 4482 4483 4484 4488 4489 4491 4493 4495 4496 4497 4499 4507 4508 4510 4511 4513 4514 4515 4518 4523 4529 4530 4531 4533 4535 4541 4546 4549 4552 4554 4555 4556 4557...
result:
ok ok 1 cases (1 test case)
Test #4:
score: 0
Accepted
time: 140ms
memory: 18092kb
input:
1 99057 99722 73893 190482185 274379837 466851670 641324039 993028302 128875937 102891466 286559847 526771097 794238060 565736409 328262657 190329865 598878250 790626887 595298790 308031819 470646878 341575785 374318107 257299536 280924175 64420619 591124604 323023069 811512407 428956686 719615923 2...
output:
82045 1 2 3 6 8 9 10 11 13 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 31 33 34 35 36 37 38 39 41 43 44 45 46 47 49 50 51 52 54 55 56 57 59 60 61 62 63 65 66 67 68 69 70 71 72 75 76 77 79 80 81 82 83 85 87 89 90 91 92 93 94 95 96 97 98 99 100 101 102 104 105 106 107 108 109 110 111 112 113 114 115 ...
result:
ok ok 1 cases (1 test case)
Test #5:
score: 0
Accepted
time: 177ms
memory: 20192kb
input:
1 100000 99990 27662 913840909 999962982 690565691 31053 780601566 31053 54745498 31053 5383 859704869 538124857 999962982 5383 66851413 1444277 31053 119603839 999962982 999833258 543197820 999833258 349576387 999833258 759855830 999833258 124692224 266093388 999962982 5383 100041707 999833258 2843...
output:
100891 60524 60525 60526 60527 60528 60529 60533 60535 60536 60537 60538 60539 60541 60542 60544 60545 60546 60548 60549 60550 60551 60552 60554 60555 60556 60557 60558 60561 60562 60563 60565 60566 60567 60568 60569 60570 60571 60572 60574 60576 60577 60578 60580 60581 60582 60584 60585 60586 60588...
result:
ok ok 1 cases (1 test case)
Test #6:
score: 0
Accepted
time: 71ms
memory: 16092kb
input:
1 100000 49997 21428 9380 4333 9380 999999628 49202 4333 49202 999999628 50841 4333 50841 999999628 77418 4333 77418 999999628 95722 4333 95722 999999628 144002 4333 144002 999999628 234359 4333 234359 999999628 268942 4333 268942 999999628 288956 4333 288956 999999628 415094 4333 415094 999999628 4...
output:
100000 7099 7100 7102 7103 7104 7105 7106 7108 7110 7113 7114 7117 7119 7120 7122 7123 7126 7130 7131 7134 7135 7136 7140 7145 7149 7151 7154 7157 7158 7160 7162 7163 7167 7170 7172 7173 7174 7176 7178 7182 7183 7184 7188 7190 7197 7199 7201 7204 7205 7206 7208 7209 7211 7212 7213 7215 7216 7221 722...
result:
ok ok 1 cases (1 test case)
Test #7:
score: -100
Time Limit Exceeded
input:
1 100000 100000 76259 931427170 7 367311884 7 646435086 7 925372747 7 371054451 7 284185575 7 695090232 7 889183241 7 615617158 7 44230096 7 293281406 7 758261641 7 685549291 7 679471071 7 723138327 7 901136691 7 49281635 7 256352978 7 320188290 7 78730802 7 788131872 7 234735044 7 664906524 7 79430...