# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
238741 | Nightlight | Priglavci (COCI18_priglavci) | C++14 | 16 ms | 640 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ABS(n) ((n) > 0 ? (n) : -(n))
#define pii pair<int, int>
using namespace std;
int N, M, C, K;
pii A[105];
pii B[105];
vector<int> bus[105];
//for macflow
vector<int> adj[205];
int cap[205][205];
int par[205];
int dist(int a, int b, int x, int y) {
return ABS(a - x) * ABS(a - x) + ABS(b - y) * ABS(b - y);
}
void edge(int u, int v, int c) {
cap[u][v] = c;
adj[u].push_back(v);
adj[v].push_back(u);
}
int bfs() {
memset(par, -1, sizeof(par));
queue<pii> q;
par[0] = -2;
q.emplace(0, 1000000);
while(!q.empty()) {
int u = q.front().first;
int flow = q.front().second;
q.pop();
for(int v : adj[u]) {
if(par[v] == -1 && cap[u][v]) {
par[v] = u;
int new_flow = min(flow, cap[u][v]);
if(v == 201) return new_flow;
q.emplace(v, new_flow);
}
}
}
return 0;
}
int maxflow() {
int flow = 0, new_flow;
while(new_flow = bfs()) {
flow += new_flow;
int u = 201;
while(u != 0) {
cap[par[u]][u] -= new_flow;
cap[u][par[u]] += new_flow;
u = par[u];
}
}
return flow;
}
void clear() {
memset(cap, 0, sizeof(cap));
adj[0].clear(), adj[201].clear();
for(int i = 1; i <= N; i++) {
adj[i].clear();
edge(0, i, 1);
}
for(int i = 1; i <= K; i++) {
adj[100 + i].clear();
edge(100 + i, 201, C);
}
}
void prepare(int mac) {
clear();
bool ok;
// cout << mac << "\n";
for(int i = 1; i <= N; i++) {
pii u = A[i];
for(int j = 1; j <= K; j++) {
ok = 0;
for(int now : bus[j]) {
pii v = B[now];
if(dist(u.first, u.second, v.first, v.second) <= mac) {
ok = 1;
break;
}
}
if(ok) {
// cout << i << " " << j << "\n";
edge(i, 100 + j, 1);
}
}
}
}
bool check(int mid) {
prepare(mid);
int res = maxflow();
// cout << mid << " " << res << "\n";
return res == N;
}
bool vis[205];
void binser() {
int l = 0, r = 2000000, res = 2000000;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) {
r = mid - 1;
res = mid;
}else l = mid + 1;
}
check(res);
printf("%d\n", res);
for(int i = 1; i <= N; i++) {
pii u = A[i];
for(int j = 1; j <= K; j++) {
if(cap[j + 100][i]) {
for(int now : bus[j]) {
pii v = B[now];
if(vis[now]) continue;
if(dist(u.first, u.second, v.first, v.second) <= res) {
printf("%d\n", now);
break;
}
}
break;
}
}
}
}
void input() {
scanf("%d %d %d %d", &N, &M, &C, &K);
if(K * C < N) {
puts("-1");
exit(0);
}
int x, y, sz;
for(int i = 1; i <= N; i++) {
scanf("%d %d", &x, &y);
A[i] = make_pair(x, y);
}
for(int i = 1; i <= M; i++) {
scanf("%d %d", &x, &y);
B[i] = make_pair(x, y);
}
for(int i = 1; i <= K; i++) {
scanf("%d", &sz);
while(sz--) {
scanf("%d", &x);
bus[i].push_back(x);
}
}
}
int main() {
input();
binser();
cin >> N;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |