QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#639325 | #6615. Cross the Maze | jty233 | RE | 1ms | 3828kb | C++23 | 5.6kb | 2024-10-13 18:59:35 | 2024-10-13 18:59:36 |
Judging History
answer
#include "bits/stdc++.h"
using ll = long long;
struct MCFGraph {
struct Edge {
int v, c;
double f;
Edge(int v, int c, double f) : v(v), c(c), f(f) {}
};
const int n;
std::vector<Edge> e;
std::vector<std::vector<int>> g;
std::vector<double> h, dis;
std::vector<int> pre;
bool dijkstra(int s, int t) {
dis.assign(n, std::numeric_limits<double>::max());
pre.assign(n, -1);
std::priority_queue<std::pair<double, int>, std::vector<std::pair<double, int>>, std::greater<>> que;
dis[s] = 0;
que.emplace(0, s);
while (!que.empty()) {
double d = que.top().first;
int u = que.top().second;
que.pop();
if (dis[u] < d) continue;
for (int i : g[u]) {
int v = e[i].v;
int c = e[i].c;
double f = e[i].f;
if (c > 0 && dis[v] > d + h[u] - h[v] + f) {
dis[v] = d + h[u] - h[v] + f;
pre[v] = i;
que.emplace(dis[v], v);
}
}
}
return dis[t] != std::numeric_limits<double>::max();
}
MCFGraph(int n) : n(n), g(n) {}
void addEdge(int u, int v, int c, int f) {
g[u].push_back(e.size());
e.emplace_back(v, c, f);
g[v].push_back(e.size());
e.emplace_back(u, 0, -f);
}
std::pair<int, double> flow(int s, int t) {
int flow = 0;
double cost = 0;
h.assign(n, 0);
while (dijkstra(s, t)) {
for (int i = 0; i < n; ++i) h[i] += dis[i];
int aug = std::numeric_limits<int>::max();
for (int i = t; i != s; i = e[pre[i] ^ 1].v) aug = std::min(aug, e[pre[i]].c);
for (int i = t; i != s; i = e[pre[i] ^ 1].v) {
e[pre[i]].c -= aug;
e[pre[i] ^ 1].c += aug;
}
flow += aug;
cost += double(aug) * h[t];
}
return std::make_pair(flow, cost);
}
};
std::vector<std::pair<int, int>> players, ropes;
using std::cin, std::cout;
int h_dis(const std::pair<int, int> &a, const std::pair<int, int> &b) {
return std::abs(a.first - b.first) + std::abs(a.second - b.second);
}
double e_dis(const std::pair<int, int> &a, const std::pair<int, int> &b) {
return std::sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second));
}
bool check(int mid, std::vector<std::pair<int, int>> &ans) {
MCFGraph g(players.size() * 2 + 5);
std::vector<std::tuple<int, int, int>> edge_id;
edge_id.reserve(players.size() * ropes.size());
for(int i = 0; i < players.size(); i++) {
for(int j = 0; j < ropes.size(); j++) {
if(h_dis(players[i], ropes[j]) > mid) {
continue;
}
edge_id.emplace_back(i, j, g.e.size());
g.addEdge(i, j + players.size(), 1, e_dis(players[i], ropes[j]));
}
}
int s = players.size() * 2;
int t = s + 1;
for(int i = 0; i < players.size(); i++) {
g.addEdge(s, i, 1, 0);
g.addEdge(i + players.size(), t, 1, 0);
}
auto [flow, cost] = g.flow(s, t);
if(flow != players.size()) {
return false;
} else {
ans.clear();
for(auto &[u, v, id] : edge_id) {
if(g.e[id].c == 0) {
ans.emplace_back(u, v);
}
}
return true;
}
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n, a, b;
cin >> n >> a >> b;
players.resize(n);
ropes.resize(n);
for(auto &[x, y] : players) {
cin >> x >> y;
}
for(auto &[x, y] : ropes) {
cin >> x >> y;
}
std::vector<std::pair<int, int>> match;
int l = 0, r = a + b;
while(l < r) {
int mid = (l + r) >> 1;
if(check(mid, match)) {
r = mid;
} else {
l = mid + 1;
}
}
cout << l << std::endl;
std::vector<std::string> moves(n);
auto pp = players;
std::mt19937 eng(std::random_device{}());
for(int _=0; _<l; _++){
std::vector vis(a+1, std::vector<bool>(b+1, false));
auto ppp = pp;
bool fl = true;
for(auto[u, v] : match) {
auto&[x, y] = ppp[u];
auto[a, b] = ropes[v];
if(x > a && !vis[x-1][y]) {
moves[u] += 'U';
x--;
goto nxt;
}
if(y > b && !vis[x][y-1]) {
moves[u] += 'L';
y--;
goto nxt;
}
if(x < a && !vis[x+1][y]) {
moves[u] += 'D';
x++;
goto nxt;
}
if(y < b && !vis[x][y+1]) {
moves[u] += 'R';
y++;
goto nxt;
}
if(x == a && y == b){
moves[u] += 'P';
}else{
fl = false;
}
nxt:;
vis[x][y] = true;
}
if(!fl){
_--;
for(int j=0; j<n; j++) moves.pop_back();
std::shuffle(match.begin(), match.end(), eng);
continue;
}
swap(ppp, pp);
}
for(auto[u, v] : match) {
auto[x, y] = players[u];
auto[a, b] = ropes[v];
std::cout << x << ' ' << y << ' '
<< a << ' ' << b << ' ' << moves[u] << '\n';
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3684kb
input:
3 4 4 1 1 1 4 4 4 1 3 2 3 2 4
output:
2 1 1 1 3 RR 1 4 2 3 LD 4 4 2 4 UU
result:
ok answer 2
Test #2:
score: 0
Accepted
time: 0ms
memory: 3632kb
input:
3 2 2 1 1 1 2 2 2 1 1 2 1 2 2
output:
1 1 1 2 1 D 1 2 1 1 L 2 2 2 2 P
result:
ok answer 1
Test #3:
score: 0
Accepted
time: 0ms
memory: 3548kb
input:
2 3 3 1 1 1 3 1 2 2 2
output:
2 1 1 1 2 RP 1 3 2 2 DL
result:
ok answer 2
Test #4:
score: 0
Accepted
time: 0ms
memory: 3684kb
input:
2 10 10 2 9 3 8 10 5 10 10
output:
10 2 9 10 10 DDDDDDDDRP 3 8 10 5 LLLDDDDDDD
result:
ok answer 10
Test #5:
score: 0
Accepted
time: 0ms
memory: 3828kb
input:
6 10 10 4 9 4 2 3 6 10 1 10 10 4 1 6 8 5 10 6 3 5 1 2 9 3 2
output:
5 4 9 2 9 UUPPP 4 2 6 3 DDRPP 3 6 6 8 DDDRR 10 1 5 1 UUUUU 10 10 5 10 UUUUU 4 1 3 2 URPPP
result:
ok answer 5
Test #6:
score: 0
Accepted
time: 0ms
memory: 3684kb
input:
8 10 10 5 1 6 8 6 3 6 4 3 10 9 5 6 7 4 1 3 8 7 3 1 2 8 6 5 8 7 6 9 4 4 1
output:
4 5 1 4 1 UPPP 6 8 5 8 UPPP 6 3 7 3 DPPP 6 4 8 6 DDRR 3 10 3 8 LLPP 9 5 9 4 LPPP 6 7 7 6 LDPP 4 1 1 2 UUUR
result:
ok answer 4
Test #7:
score: 0
Accepted
time: 0ms
memory: 3752kb
input:
1 10 10 8 3 8 4
output:
1 8 3 8 4 R
result:
ok answer 1
Test #8:
score: 0
Accepted
time: 0ms
memory: 3604kb
input:
1 10 10 10 1 6 6
output:
9 10 1 6 6 UUUURRRRR
result:
ok answer 9
Test #9:
score: 0
Accepted
time: 1ms
memory: 3688kb
input:
8 10 10 7 8 4 6 10 9 4 7 4 3 10 6 3 3 2 7 3 7 2 10 3 8 1 9 6 1 3 10 10 2 6 4
output:
7 7 8 3 10 UUUURRP 4 6 2 10 UURRRRP 10 9 10 2 LLLLLLL 4 7 3 8 URPPPPP 4 3 6 1 LLDDPPP 10 6 6 4 UUUULLP 3 3 3 7 RRRRPPP 2 7 1 9 URRPPPP
result:
ok answer 7
Test #10:
score: 0
Accepted
time: 0ms
memory: 3664kb
input:
1 10 10 10 3 2 6
output:
11 10 3 2 6 UUUUUUUURRR
result:
ok answer 11
Test #11:
score: 0
Accepted
time: 0ms
memory: 3544kb
input:
3 10 10 7 8 4 4 3 1 7 10 6 7 2 4
output:
5 7 8 7 10 RRPPP 4 4 6 7 DDRRR 3 1 2 4 URRRP
result:
ok answer 5
Test #12:
score: 0
Accepted
time: 0ms
memory: 3556kb
input:
9 10 10 6 4 1 7 2 1 5 6 10 8 3 5 9 9 9 2 4 9 5 3 3 2 6 9 2 2 9 4 7 8 2 8 1 1 4 8
output:
5 6 4 3 2 UUULL 1 7 2 8 DRPPP 2 1 1 1 UPPPP 5 6 5 3 LLLPP 10 8 7 8 UUUPP 3 5 2 2 ULLLP 9 9 6 9 UUUPP 9 2 9 4 RRPPP 4 9 4 8 LPPPP
result:
ok answer 5
Test #13:
score: 0
Accepted
time: 0ms
memory: 3600kb
input:
2 10 10 9 8 3 3 5 8 4 9
output:
7 9 8 5 8 UUUUPPP 3 3 4 9 DRRRRRR
result:
ok answer 7
Test #14:
score: 0
Accepted
time: 0ms
memory: 3820kb
input:
8 10 10 10 5 8 4 2 8 2 4 10 8 6 6 1 7 10 1 8 6 10 5 10 2 5 9 8 10 10 4 3 9 4 2
output:
4 10 5 10 5 PPPP 8 4 10 4 DDPP 2 8 5 9 DDDR 2 4 4 2 LLDD 10 8 8 10 UURR 6 6 8 6 DDPP 1 7 3 9 DDRR 10 1 10 2 RPPP
result:
ok answer 4
Test #15:
score: 0
Accepted
time: 0ms
memory: 3600kb
input:
1 10 10 1 9 2 10
output:
2 1 9 2 10 DR
result:
ok answer 2
Test #16:
score: 0
Accepted
time: 0ms
memory: 3612kb
input:
8 10 10 5 10 3 8 2 8 3 5 4 2 8 2 7 9 3 4 8 9 9 6 3 6 10 2 4 10 10 6 6 5 5 5
output:
6 5 10 8 9 LDDDPP 3 8 4 10 DRRPPP 2 8 3 6 LLDPPP 3 5 6 5 DDDPPP 4 2 10 2 DDDDDD 8 2 10 6 DDRRRR 7 9 9 6 LLLDDP 3 4 5 5 DDRPPP
result:
ok answer 6
Test #17:
score: 0
Accepted
time: 0ms
memory: 3676kb
input:
1 10 10 8 6 1 8
output:
9 8 6 1 8 UUUUUUURR
result:
ok answer 9
Test #18:
score: 0
Accepted
time: 0ms
memory: 3588kb
input:
10 10 10 7 10 4 4 9 10 5 7 10 7 4 1 1 5 6 7 6 4 5 3 5 7 1 9 1 6 8 3 5 1 10 8 2 6 4 2 3 10 3 1
output:
5 7 10 3 10 UUUUP 4 4 3 1 ULLLP 9 10 10 8 LLDPP 5 7 1 6 UUUUL 10 7 5 7 UUUUU 4 1 5 1 DPPPP 1 5 1 9 RRRRP 6 7 2 6 UUUUL 6 4 8 3 LDDPP 5 3 4 2 ULPPP
result:
ok answer 5
Test #19:
score: 0
Accepted
time: 0ms
memory: 3608kb
input:
7 10 10 4 5 1 5 6 5 9 6 5 5 9 3 1 10 10 6 6 2 5 1 2 7 8 1 7 10 6 3
output:
6 4 5 5 1 LLLLDP 1 5 2 7 DRRPPP 6 5 6 3 LLPPPP 9 6 10 6 DPPPPP 5 5 6 2 LLLDPP 9 3 8 1 ULLPPP 1 10 7 10 DDDDDD
result:
ok answer 6
Test #20:
score: -100
Runtime Error
input:
6 10 10 9 7 4 1 9 1 7 9 2 6 9 5 5 1 4 1 2 10 4 10 3 1 1 7
output:
8