제출 #41889

#제출 시각아이디문제언어결과실행 시간메모리
41889funcsr도시들 (IOI15_towns)C++14
0 / 100
1116 ms524288 KiB
#include "towns.h" #include <vector> #include <iostream> #include <algorithm> #include <queue> #include <cassert> #include <set> using namespace std; typedef pair<int, int> P; #define rep(i, n) for (int i=0; i<(n); i++) #define pb push_back #define _1 first #define _2 second #define INF 1145141919 #define MOD 1000000007 #define all(x) x.begin(), x.end() #define uniq(x) x.erase(unique(all(x)), x.end()) #define MAX_V 300 int dist[MAX_V][MAX_V]; int U[MAX_V]; vector<int> R[MAX_V]; int find(int x) { if (U[x] == x) return x; return U[x] = find(U[x]); } void unite(int x, int y) { x = find(x), y = find(y); if (x == y) return; U[x] = y; } vector<P> G[MAX_V]; int dfs(int x, int p, int r) { int ret = r; for (P pp : G[x]) if (pp._1 != p) { int t = pp._1, len = pp._2; ret = max(ret, dfs(t, x, r+len)); } return ret; } int hubDistance(int N, int sub) { rep(i, MAX_V) rep(j, MAX_V) dist[i][j] = 0; rep(i, N) rep(j, i) dist[i][j] = dist[j][i] = getDistance(i, j); set<int> nokori; rep(i, N) nokori.insert(i); int V = N; while (nokori.size() >= 2) { rep(i, V) U[i] = i; if (nokori.size() > 2) { for (int u : nokori) for (int v : nokori) if (u < v) { int l = dist[u][v]; vector<int> vs; for (int x : nokori) if (x != u && x != v) vs.pb(dist[x][u]-dist[x][v]); sort(all(vs)); uniq(vs); if (vs.size() > 1) continue; unite(u, v); } } else { unite(*nokori.begin(), *nokori.rbegin()); } rep(i, V) R[i].clear(); for (int x : nokori) R[find(x)].pb(x); rep(i, V) if (R[i].size()) { assert(R[i].size() >= 2); int x0 = R[i][0], x1 = R[i][1]; for (int x : R[i]) nokori.erase(x); if (nokori.empty()) assert(R[i].size() >= 3); int tekitou = -1; if (nokori.empty()) tekitou = R[i][2]; else tekitou = *nokori.begin(); int sum = dist[x0][x1], diff = dist[x0][tekitou] - dist[x1][tekitou]; int a = (sum+diff)/2; int root = V++; G[root].pb(P(x0, a)); G[x0].pb(P(root, a)); dist[x0][root] = dist[root][x0] = a; for (int x : R[i]) if (x != x0) { int d = dist[x0][x] - a; dist[x][root] = dist[root][x] = d; G[root].pb(P(x, d)); G[x].pb(P(root, d)); } for (int x : nokori) dist[root][x] = dist[x][root] = dist[x0][x] - a; assert(V <= MAX_V); nokori.insert(root); break; } } int R = INF; rep(i, V) { R = min(R, dfs(i, -1, 0)); } return R; }

컴파일 시 표준 에러 (stderr) 메시지

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:53:13: warning: unused variable 'l' [-Wunused-variable]
         int l = dist[u][v];
             ^
towns.cpp:92:7: warning: declaration of 'R' shadows a global declaration [-Wshadow]
   int R = INF;
       ^
towns.cpp:22:13: note: shadowed declaration is here
 vector<int> R[MAX_V];
             ^
towns.cpp: At global scope:
towns.cpp:42:28: warning: unused parameter 'sub' [-Wunused-parameter]
 int hubDistance(int N, int sub) {
                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...