QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#623793 | #9424. Stop the Castle 2 | IllusionaryDominance | WA | 40ms | 12488kb | C++20 | 5.0kb | 2024-10-09 14:01:07 | 2024-10-09 14:01:08 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef pair <int, int> pii;
const int MAX_N = 200000 + 5;
const int MAX_M = 500000 + 5;
int N, M, K, tot, n;
struct Node{
int x, y, id;
}node[MAX_N];
struct Edge{
int y, prev, idx;
}e[MAX_M];
int elast[MAX_N], ecnt;
int dx[MAX_N], dy[MAX_N], lin[MAX_N];
char chosen[MAX_N], mark[MAX_N];
vector <int> edge[MAX_N];
void Build(int x, int y, int z) {
ecnt ++;
e[ecnt].y = y;
e[ecnt].idx = z;
e[ecnt].prev = elast[x];
elast[x] = ecnt;
}
bool bfs() {
bool flag = false;
static int q[MAX_N];
int hd = 0, tl = -1;
memset(dy, 0, sizeof(int) * (tot + 1));
for (int i = 1; i <= n; i ++) {
dx[i] = 0;
if (!chosen[i]) q[++ tl] = i;
}
while (hd <= tl) {
int u = q[hd ++];
for (int i = elast[u]; i; i = e[i].prev) {
int v = e[i].y;
if (!dy[v]) {
dy[v] = dx[u] + 1;
if (!lin[v]) flag = true;
else {
q[++ tl] = lin[v];
dx[lin[v]] = dy[v] + 1;
}
}
}
}
return flag;
}
bool Find_aug(int u) {
for (int i = elast[u]; i; i = e[i].prev) {
int v = e[i].y;
if (dy[v] == dx[u] + 1) {
dy[v] = 0;
if (!lin[v] || Find_aug(lin[v])) {
lin[v] = u;
return chosen[u] = 1;
}
}
}
return false;
}
void solve() {
ecnt = 0;
memset(elast, 0, sizeof(int) * n + 1);
memset(lin, 0, sizeof(int) * (tot + 1));
memset(chosen, 0, n + 1); memset(mark, 0, M + 1);
for (int i = 1; i <= M; i ++) edge[i].clear();
tot = 0;
cin >> N >> M >> K;
for (int i = 1; i <= N; i ++) {
cin >> node[i].x >> node[i].y;
node[i].id = -i;
}
for (int i = 1; i <= M; i ++) {
cin >> node[i + N].x >> node[i + N].y;
node[i + N].id = i;
}
auto cmp_by_x = [&](const Node &i, const Node &j) -> bool {
return i.x < j.x || (i.x == j.x && i.y < j.y);
};
auto cmp_by_y = [&](const Node &i, const Node &j) -> bool {
return i.y < j.y || (i.y == j.y && i.x < j.x);
};
sort(node + 1, node + N + M + 1, cmp_by_x);
for (int l = 1, r; l <= N + M; l = r) {
for (r = l; r <= N + M && node[l].x == node[r].x; r ++);
for (int i = l, j; i < r; i = j) {
for ( ; i < r && node[i].id > 0; i ++);
for (j = i + 1; j < r && node[j].id > 0; j ++);
if (i < r && j < r) {
tot ++;
for (int k = i + 1; k < j; k ++) {
edge[node[k].id].push_back(tot);
}
}
}
}
n = tot;
sort(node + 1, node + N + M + 1, cmp_by_y);
for (int l = 1, r; l <= N + M; l = r) {
for (r = l; r <= N + M && node[l].y == node[r].y; r ++);
for (int i = l, j; i < r; i = j) {
for ( ; i < r && node[i].id > 0; i ++);
for (j = i + 1; j < r && node[j].id > 0; j ++);
if (i < r && j < r) {
tot ++;
for (int k = i + 1; k < j; k ++) {
edge[node[k].id].push_back(tot);
}
}
}
}
for (int i = 1; i <= M; i ++) {
if ((int)edge[i].size() == 2) {
Build(edge[i][0], edge[i][1], i);
}
}
while (bfs()) {
for (int i = 1; i <= n; i ++)
if (!chosen[i]) Find_aug(i);
}
int ans = tot, rem = M - K;
if (rem) {
for (int i = 1; i <= n; i ++) {
if (chosen[i]) {
for (int j = elast[i]; j; j = e[j].prev) {
int v = e[j].y;
if (lin[v] == i) {
ans -= 2;
mark[e[j].idx] = 1;
break;
}
}
if (!-- rem) break;
}
}
}
if (rem) {
for (int i = 1; i <= M; i ++) {
if (!mark[i]) {
char flag = 0;
for (auto x : edge[i]) {
if (!lin[x]) {
lin[x] = 1;
ans --;
flag = 1;
mark[i] = 1;
break;
}
}
if (flag && !(-- rem)) break;
}
}
}
if (rem) {
for (int i = 1; i <= M; i ++) {
if (!mark[i]) {
mark[i] = 1;
if (!-- rem) break;
}
}
}
cout << ans << '\n';
for (int i = 1; i <= M; i ++) {
if (!mark[i]) cout << i << ' ';
}
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T --) solve();
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 11888kb
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: -100
Wrong Answer
time: 40ms
memory: 12488kb
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 12 13 14 15 2 10 11 12 13 14 4 3 4 5 6 7 8 ...
result:
wrong answer Participant states the answer to be 2 but is actually 3 (test case 48)