QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#608820 | #9424. Stop the Castle 2 | real_sigma_team | WA | 51ms | 6496kb | C++23 | 4.3kb | 2024-10-04 04:26:30 | 2024-10-04 04:26:30 |
Judging History
answer
#include <bits/stdc++.h>
#include <immintrin.h>
using namespace std;
using ll = long long;
using ld = long double;
# define x first
# define y second
# define all(x) x.begin(), x.end()
# define rall(x) x.rbegin(), x.rend()
mt19937 mt(123);
void solve();
void init();
int32_t main() {
#ifndef LOCAL
cin.tie(nullptr)->sync_with_stdio(false);
#endif
init();
cout << fixed << setprecision(10);
int t = 1;
cin >> t;
while (t--) {
solve();
}
}
void init() {}
int get(int x, vector<int>& dsu) {
return dsu[x] == x ? x : dsu[x] = get(dsu[x], dsu);
}
void merge(int x, int y, vector<int>& dsu) {
dsu[get(y, dsu)] = get(x, dsu);
}
void solve() {
int n, m, k;
cin >> n >> m >> k;
vector<int> uv(m, 0), uh(m, 0);
vector<pair<int, int>> a(n), b(m);
unordered_map<int, vector<pair<int, int>>> v, h;
for (int i = 0; i < n; i++) {
cin >> a[i].x >> a[i].y;
v[a[i].x].emplace_back(a[i].y, -1);
h[a[i].y].emplace_back(a[i].x, -1);
}
vector<int> dsuv(m), dsuh(m);
for (int i = 0; i < m; i++) {
cin >> b[i].x >> b[i].y;
v[b[i].x].emplace_back(b[i].y, i);
h[b[i].y].emplace_back(b[i].x, i);
dsuv[i] = i;
dsuh[i] = i;
}
int ans = 0;
for (auto [tr, vc] : v) {
sort(all(vc));
while (!vc.empty() && vc.back().y != -1) {
vc.pop_back();
}
reverse(all(vc));
while (!vc.empty() && vc.back().y != -1) {
vc.pop_back();
}
reverse(all(vc));
for (int i = 0; i + 1 < vc.size(); i++) {
if (vc[i].y != -1 && vc[i + 1].y != -1) {
merge(vc[i].y, vc[i + 1].y, dsuv);
}
if (vc[i].y == -1 && vc[i + 1].y == -1) {
ans++;
}
if (vc[i].y != -1) {
uv[vc[i].y] = 1;
}
}
}
for (auto [tr, vc] : h) {
sort(all(vc));
while (!vc.empty() && vc.back().y != -1) {
vc.pop_back();
}
reverse(all(vc));
while (!vc.empty() && vc.back().y != -1) {
vc.pop_back();
}
reverse(all(vc));
for (int i = 0; i + 1 < vc.size(); i++) {
if (vc[i].y != -1 && vc[i + 1].y != -1) {
merge(vc[i].y, vc[i + 1].y, dsuh);
}
if (vc[i].y == -1 && vc[i + 1].y == -1) {
ans++;
}
if (vc[i].y != -1) {
uh[vc[i].y] = 1;
}
}
}
vector<vector<int>> g(2 * m);
vector<int> pr(m, -1), cost(m, 0), usedv(m, 0), usedh(m, 0), used(m, 0);
for (int i = 0; i < m; i++) {
if (uv[i] && uh[i]) {
g[get(i, dsuv)].push_back(get(i, dsuh) + m);
}
}
vector<pair<int, int>> ord(m);
for (int i = 0; i < m; i++) {
ord[i] = {g[i].size(), i};
}
sort(all(ord));
for (int tr = 0; tr < m; tr++) {
int i = ord[tr].y;
for (int j : g[i]) {
if (!used[j - m]) {
pr[i] = j;
used[j - m] = 1;
break;
}
}
}
for (int i = 0; i < m; i++) {
if (uv[i] && uh[i] && pr[get(i, dsuv)] == get(i, dsuh) + m) {
cost[i] = 2;
usedv[get(i, dsuv)] = 1;
usedh[get(i, dsuh)] = 1;
}
}
for (int i = 0; i < m; i++) {
if (uv[i] && !usedv[get(i, dsuv)]) {
cost[i] = 1;
usedv[get(i, dsuv)] = 1;
}
if (uh[i] && !usedh[get(i, dsuh)]) {
cost[i] = 1;
usedh[get(i, dsuh)] = 1;
}
}
vector<int> res;
for (int i = 0; i < m && res.size() < k; i++) {
if (!cost[i]) {
res.push_back(i + 1);
}
}
for (int i = 0; i < m && res.size() < k; i++) {
if (cost[i] == 1) {
res.push_back(i + 1);
ans++;
}
}
for (int i = 0; i < m && res.size() < k; i++) {
if (cost[i] == 2) {
res.push_back(i + 1);
ans += 2;
}
}
cout << ans << '\n';
for (int i : res) {
cout << i << ' ';
}
cout << '\n';
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3668kb
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 3 5 2 6 2 1 0 1 2
result:
ok ok 3 cases (3 test cases)
Test #2:
score: -100
Wrong Answer
time: 51ms
memory: 6496kb
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 1 2 3 4 5 6 7 8 9 10 11 12 13 15 15 1 2 0 1 2 3 4 0 1 2 3 4 5 6 7 8 11 1 3 8 2 3 1 0 1 2 3 4 5 6 7 8 9 10 11 12 1 1 2 3 4 5 6 7 8 1 2 3 1 1 2 3 4 5 6 7 8 7 1 2 10 1 2 3 1 1 2 3 4 5 6 7 8 10 11 12 0 1 1 1 2 0 1 2 3 7 1 2 3 4 6 2 2 4 5 6 7 4 1 2 3 4 5 6 1 1 1 1 2 3 4 5 6 16 2 5 ...
result:
wrong answer Jury has better answer. Participant's answer is 21 while jury's answer is 20 (test case 338)