Submission #55263

#TimeUsernameProblemLanguageResultExecution timeMemory
55263IvanCPriglavci (COCI18_priglavci)C++17
160 / 160
4 ms1360 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e3 + 10; const int INF = 4*1e6 + 10; int X[MAXN],Y[MAXN],pX[MAXN],pY[MAXN],menor[MAXN][MAXN],qual[MAXN][MAXN],onibus[MAXN]; int capacidade[MAXN],par[MAXN],visitado[MAXN]; int N,M,C,K; int bpm(int v,int L){ if(visitado[v]) return 0; visitado[v] = 1; for(int u = 1;u<=K;u++){ if(menor[v][u] > L) continue; if(capacidade[u] == 0) continue; par[v] = u; capacidade[u]--; return 1; } for(int w = 1;w<=N;w++){ int u = par[w]; if(u == -1) continue; if(menor[v][u] > L) continue; if(!bpm(w,L)) continue; par[v] = u; return 1; } return 0; } int max_match(int L){ for(int i = 1;i<=K;i++){ capacidade[i] = C; } for(int i = 1;i<=N;i++) par[i] = -1; for(int i = 1;i<=N;i++){ memset(visitado,0,sizeof(visitado)); if(!bpm(i,L)) return 0; } return 1; } int sq(int x){return x*x;} int main(){ cin >> N >> M >> C >> K; for(int i = 1;i<=N;i++){ cin >> X[i] >> Y[i]; } for(int i = 1;i<=M;i++){ cin >> pX[i] >> pY[i]; } for(int i = 1;i<=K;i++){ int ki; cin >> ki; for(int j = 1;j<=ki;j++){ int x; cin >> x; onibus[x] = i; } } for(int i = 1;i<=N;i++){ for(int j = 1;j<=K;j++) menor[i][j] = 2*INF; for(int j = 1;j<=M;j++){ int distancia = sq(X[i] - pX[j]) + sq(Y[i] - pY[j]); if(distancia < menor[i][onibus[j]]){ qual[i][onibus[j]] = j; menor[i][onibus[j]] = distancia; } } } if(!max_match(INF)){ cout << -1 << endl; return 0; } int ini = 1,fim = INF,resposta = -1,meio; while(ini <= fim){ meio = ini + (fim - ini)/2; if(max_match(meio)){ resposta = meio; fim = meio - 1; } else{ ini = meio + 1; } } max_match(resposta); cout << resposta << endl; for(int i = 1;i<=N;i++) cout << qual[i][par[i]] << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...