QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#609821 | #9412. Stop the Castle | UESTC_OldEastWest# | WA | 3ms | 14984kb | C++17 | 8.1kb | 2024-10-04 14:09:01 | 2024-10-04 14:09:02 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
namespace Dinic {
int n, s, t, tot;
std::vector<int> to, nxt, cap, head;
std::vector<int> cur, dep;
void AddEdge(int u, int v, int c) {
to[tot] = v, nxt[tot] = head[u], cap[tot] = c, head[u] = tot++;
}
void Init(int _n, int _s, int _t, std::vector<std::array<int, 3> > &edge) {
n = _n, s = _s, t = _t, tot = 0;
int m = edge.size();
to = nxt = cap = std::vector<int>(m << 1);
head = cur = dep = std::vector<int>(n, -1);
for (auto [u, v, c] : edge) {
AddEdge(u, v, c);
AddEdge(v, u, 0);
}
}
bool BFS() {
dep = std::vector<int>(n, -1);
std::vector<int> que(1, s);
dep[s] = 0;
for (int h = 0, u; h < que.size(); ++h) {
u = que[h];
for (int i = head[u], v, c; ~i; i = nxt[i]) {
v = to[i], c = cap[i];
if (dep[v] == -1 && c) dep[v] = dep[u] + 1, que.emplace_back(v);
}
}
return dep[t] != -1;
}
int DFS (int u, int in) {
if (u == t || !in) return in;
int out = 0;
for (int i = cur[u], v, c; ~i; i = nxt[i]) {
cur[u] = nxt[i];
v = to[i], c = cap[i];
if (c && dep[v] == dep[u] + 1) {
int ret = DFS(v, std::min(in, c));
in -= ret, out += ret;
cap[i] -= ret, cap[i ^ 1] += ret;
}
}
return out;
}
int getMaxFlow() {
int ans = 0;
while (BFS()) {
cur = head;
ans += DFS(s, INT_MAX);
}
return ans;
}
}
void charming() {
int n; std::cin >> n;
std::vector<std::pair<int, int> > castle;
std::vector<int> all_r, all_c;
for (int i = 0, r, c; i < n; ++i) {
std::cin >> r >> c;
castle.emplace_back(std::make_pair(r, c));
all_r.emplace_back(r), all_r.emplace_back(r - 1), all_r.emplace_back(r + 1);
all_c.emplace_back(c), all_c.emplace_back(c + 1), all_c.emplace_back(c - 1);
}
int m; std::cin >> m;
std::vector<std::pair<int, int> > obstacle;
for (int i = 0, r, c; i < m; ++i) {
std::cin >> r >> c;
all_r.emplace_back(r), all_r.emplace_back(r - 1), all_r.emplace_back(r + 1);
all_c.emplace_back(c), all_c.emplace_back(c + 1), all_c.emplace_back(c - 1);
obstacle.emplace_back(std::make_pair(r, c));
}
sort(all_r.begin(), all_r.end());
all_r.resize(unique(all_r.begin(), all_r.end()) - all_r.begin());
sort(all_c.begin(), all_c.end());
all_c.resize(unique(all_c.begin(), all_c.end()) - all_c.begin());
for (int i = 0; i < n; ++i) {
int r = castle[i].first, c = castle[i].second;
r = lower_bound(all_r.begin(), all_r.end(), r) - all_r.begin() + 1;
c = lower_bound(all_c.begin(), all_c.end(), c) - all_c.begin() + 1;
castle[i] = std::make_pair(r, c);
}
for (int i = 0; i < m; ++i) {
int r = obstacle[i].first, c = obstacle[i].second;
r = lower_bound(all_r.begin(), all_r.end(), r) - all_r.begin() + 1;
c = lower_bound(all_c.begin(), all_c.end(), c) - all_c.begin() + 1;
obstacle[i] = std::make_pair(r, c);
}
std::function<bool(int, int, int)> Check = [&](int x, int y, int z) {
if (x > y) std::swap(x, y);
if (z > x && z < y) return true;
else return false;
};
std::function<bool(int, int, int, int)> hinder = [&](int idx0, int idx1, int idx2, int type) {
bool r_same = castle[idx0].first == castle[idx1].first;
if (type == 0) {
if (r_same) {
if (castle[idx2].first != castle[idx0].first) return false;
int c0 = castle[idx0].second, c1 = castle[idx1].second, c2 = castle[idx2].second;
return Check(c0, c1, c2);
}
else {
if (castle[idx2].second != castle[idx0].second) return false;
int r0 = castle[idx0].first, r1 = castle[idx1].first, r2 = castle[idx2].first;
return Check(r0, r1, r2);
}
}
else {
if (r_same) {
if (obstacle[idx2].first != castle[idx0].first) return false;
int c0 = castle[idx0].second, c1 = castle[idx1].second, c2 = obstacle[idx2].second;
return Check(c0, c1, c2);
}
else {
if (obstacle[idx2].second != castle[idx0].second) return false;
int r0 = castle[idx0].first, r1 = castle[idx1].first, r2 = obstacle[idx2].first;
return Check(r0, r1, r2);
}
}
};
int s = 0, t = 1, tot = 2;
std::map<int, int> mp0;
std::map<std::pair<int, int>, int> mp1;
std::vector<std::array<int, 3> > edge;
bool chk = true;
int max_r = int(all_r.size()) + 1;
int max_c = int(all_c.size()) + 1;
int ans = 0, c = 0;
std::vector<std::vector<int> > set;
std::vector vec(max_r, std::vector (max_c, std::vector<int> ()));
std::vector<std::pair<int, int> > pos;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (abs(castle[i].first - castle[j].first) + abs(castle[i].second - castle[j].second) <= 1) {
chk = false;
break;
}
if (castle[i].first == castle[j].first || castle[i].second == castle[j].second) {
bool fight = true;
for (int k = 0; k < n; ++k) if (k != i && k != j) {
if (hinder(i, j, k, 0)) {fight = false; break;}
}
for (int k = 0; k < m && fight; ++k) {
if (hinder(i, j, k, 1)) {fight = false; break;}
}
if (fight) {
++ans, ++c;
set.emplace_back(std::vector<int> (1, c));
if (castle[i].first == castle[j].first) {
pos.emplace_back(std::make_pair(castle[i].first, std::min(castle[i].second, castle[j].second) + 1));
int l = castle[i].second, r = castle[j].second;
if (l > r) std::swap(l, r);
for (int k = l + 1; k < r; ++k) {
vec[castle[i].first][k].emplace_back(c);
}
}
else {
pos.emplace_back(std::make_pair(std::min(castle[i].first, castle[j].first) + 1, castle[i].second));
int l = castle[i].first, r = castle[j].first;
if (l > r) std::swap(l, r);
for (int k = l + 1; k < r; ++k) {
vec[k][castle[i].second].emplace_back(c);
}
}
}
}
}
if (!chk) break;
}
if (!chk) {
std::cout << -1 << '\n';
return;
}
// std::vector<std::pair<int, int> > two_set;
// std::vector<std::vector<int> > conf(c + 1);
//
// int two_cnt = 0;
for (int i = 1; i < max_r; ++i) {
for (int j = 1; j < max_c; ++j) {
if (vec[i][j].size() > 1) {
pos.emplace_back(std::make_pair(i, j));
set.emplace_back(vec[i][j]);
// two_set.emplace_back(i);
// for (int x : vec[i][j]) conf[x].emplace_back(i);
// mp0[i] = tot++;
// ++two_cnt;
// edge.emplace_back((std::array<int, 3>) {s, tot - 1, 1});
}
}
}
// for (int i = 0; i < c; ++i) {
// int siz = conf[i].size();
// for (int j = 0; j < siz; ++j) {
//
// }
// }
reverse(pos.begin(), pos.end());
reverse(set.begin(), set.end());
int set_cnt = set.size();
std::vector<int> used(N), vis(N);
std::vector<std::pair<int, int> > ans_pos;
while (true) {
bool brk = true;
for (int i = 0; i < set_cnt; ++i) if (!used[i]) {
if (int(set[i].size()) < 2) break;
bool two = true;
for (int x : set[i]) {
if (vis[x]) {two = false; break;}
}
if (two) {
for (int x : set[i]) vis[x] = 1;
ans_pos.emplace_back(pos[i]);
--ans;
brk = false;
break;
}
}
if (brk) break;
}
for (int i = 0; i < set_cnt; ++i) if (!used[i]) {
bool ok = false;
for (int x : set[i]) {
if (!vis[x]) {
vis[x] = 1;
ok = true;
}
}
if (ok) {
ans_pos.emplace_back(pos[i]);
}
}
std::cout << ans << '\n';
for (auto [r, c] : ans_pos) {
std::cout << all_r[r - 1] << ' ' << all_c[c - 1] << '\n';
}
// int set_cnt = set.size();
// for (int i = 0; i < set_cnt; ++i) {
// mp0[i] = tot++;
// for (int x : set[i]) {
// edge.emplace_back();
// }
// }
}
signed main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
int t; std::cin >> t;
while (t--) charming();
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 11148kb
input:
4 7 1 3 6 6 4 7 2 1 6 3 4 1 2 6 3 3 4 6 4 3 1 2 1 1 2 2 0 3 1 1 1 3 3 3 1 1 2 3 1 1 1 3 2 3 0
output:
2 4 6 2 3 0 1 2 3 -1
result:
ok ok 4 cases (4 test cases)
Test #2:
score: 0
Accepted
time: 0ms
memory: 14984kb
input:
21 11 3 5 18 6 19 12 27 48 28 38 30 12 33 18 42 18 43 38 45 46 48 34 3 2 6 24 4 41 45 15 11 6 15 27 16 9 16 14 16 48 19 26 25 12 27 26 28 4 31 40 32 6 33 50 37 50 46 11 50 29 17 1 49 4 9 9 15 9 22 11 31 11 46 14 28 17 5 17 49 18 43 20 31 30 46 33 11 33 33 34 15 36 6 47 10 2 16 46 36 30 11 7 34 7 41 ...
output:
3 34 18 29 38 20 12 5 34 50 20 26 16 15 16 10 12 6 0 1 16 10 0 1 43 22 5 44 45 42 44 33 10 1 13 1 3 0 5 44 4 29 26 27 41 21 15 8 1 1 32 9 0 0 0 0 6 35 34 23 10 29 21 24 46 23 44 12 11 0 3 43 25 31 17 20 30 0 -1 3 16 36 25 7 17 39 6 8 11 7 5 8 10 8 9 6 5 5 5
result:
ok ok 21 cases (21 test cases)
Test #3:
score: -100
Wrong Answer
time: 3ms
memory: 14444kb
input:
2 200 7 52 9 160 10 4 12 61 18 436 19 430 20 499 24 139 25 416 29 53 33 153 35 275 35 310 37 25 38 477 39 349 42 120 44 158 45 330 49 486 50 204 51 67 52 138 52 305 56 139 63 132 66 4 67 327 70 484 71 67 72 308 74 218 76 479 81 139 82 90 86 201 87 335 91 35 91 220 92 496 94 29 94 436 96 359 97 299 1...
output:
51 393 307 352 305 349 138 334 367 311 374 277 356 270 275 224 153 199 467 185 160 154 496 132 67 126 61 94 35 52 139 393 186 393 112 352 61 311 177 311 147 306 374 260 275 199 432 187 467 154 305 126 275 91 160 453 251 440 179 415 305 390 308 380 385 311 455 286 367 278 272 277 189 274 67 271 186 2...
result:
wrong answer Participant's answer is 51, but jury has better answer 46 (test case 1)