Submission #799944

#TimeUsernameProblemLanguageResultExecution timeMemory
799944Ronin13Towns (IOI15_towns)C++17
0 / 100
171 ms31968 KiB
#include "towns.h" #include <bits/stdc++.h> #define ll long long #define f first #define s second #define pii pair<int,int> #define pll pair<ll,ll> #define pb push_back #define epb emplace_back #define ull unsigned ll using namespace std; const int nmax = 1000001; vector <vector <int> > vec(nmax); vector <int> p(nmax), sz(nmax); void make_set(int v){ p[v] = v; sz[v] = 1; } int find_set(int v){ return p[v] == v ? v : p[v] = find_set(p[v]); } void union_sets(int a, int b){ a = find_set(a); b = find_set(b); if(a == b) return; p[b] = a; sz[a] += sz[b]; } int hubDistance(int n, int sub) { int A; int d[n][2]; d[0][0] = 0; A = 0; for(int i = 1; i < n; i++){ d[i][0] = getDistance(0, i); if(d[i][0] > d[A][0]){ A = i; } } int diam = 0; d[A][1] = 0; for(int i = 0; i < n; i++){ if(A != i) d[i][1] = getDistance(A, i); diam = max(d[i][1], diam); } //cout << diam; int r = 1e9 + 1; for(int i = 0; i < n; i++){ int a = d[i][1] + d[0][1] - d[i][0]; a >>= 1; vec[a].pb(i); r = min(r, max(diam - a, a)); } vector <int> u; int cnt = 0; int cnd = -1; for(int i = 0; i <= 1000000; i++){ //if(vec[r].empty()) continue; if(i >= diam - r) cnt += vec[i].size(); } if(n - cnt <= n / 2) cnd = diam - r; //cout << cnd << "\n"; cnt = 0; for(int i = 0; i <= 1000000; i++){ //if(vec[r].empty()) continue; if(i >=r) cnt += vec[i].size(); } if(n - cnt <= n / 2) cnd = r; if(cnd == -1){ return -r; } //cout << cnd << "\n"; vector <int> dead; vector <int> alive; for(int i = 0; i <= 1000000; i++){ if(i >= cnd){ for(int j = 0; j < vec[i].size(); j++) alive.pb(vec[i][j]); } } for(int i = 0; i < alive.size(); i++){ make_set(alive[i]); } //vector <int> left; int left = -1; while(!alive.empty()){ vector <int> nw; for(int i = 0; i < (int)alive.size() - 1; i+=2){ int x = alive[i], y = alive[i + 1]; int len = getDistance(x, y); int v = d[x][1] + d[y][1] - len; if(v <= 2 * cnd){ dead.pb(x); dead.pb(y); } else union_sets(x, y), nw.pb(x); } if(alive.size() % 2 == 1){ if(left != -1) dead.pb(left); left = alive.back(); } swap(nw, alive); } if(left == -1) return -r; cnt = sz[left]; for(int i = 0; i < dead.size(); i++){ int o = dead[i]; int len = getDistance(o, left); int v = d[o][1] + d[left][1] - len; if(v > 2 * cnd){ cnt += sz[o]; } } if(cnt > n / 2)return -r; return r; }

Compilation message (stderr)

towns.cpp: In function 'int hubDistance(int, int)':
towns.cpp:64:40: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   64 |   if(i >= diam - r) cnt += vec[i].size();
      |                                        ^
towns.cpp:71:32: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   71 |   if(i >=r) cnt += vec[i].size();
      |                                ^
towns.cpp:82:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |    for(int j = 0; j < vec[i].size(); j++)
      |                   ~~^~~~~~~~~~~~~~~
towns.cpp:86:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |  for(int i = 0; i < alive.size(); i++){
      |                 ~~^~~~~~~~~~~~~~
towns.cpp:111:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |  for(int i = 0; i < dead.size(); i++){
      |                 ~~^~~~~~~~~~~~~
towns.cpp:34:28: warning: unused parameter 'sub' [-Wunused-parameter]
   34 | 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...