QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#623793#9424. Stop the Castle 2IllusionaryDominanceWA 40ms12488kbC++205.0kb2024-10-09 14:01:072024-10-09 14:01:08

Judging History

This is the latest submission verdict.

  • [2024-10-09 14:01:08]
  • Judged
  • Verdict: WA
  • Time: 40ms
  • Memory: 12488kb
  • [2024-10-09 14:01:07]
  • Submitted

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;
}

詳細信息

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)