Submission #16583

# Submission time Handle Problem Language Result Execution time Memory
16583 2015-08-28T12:30:01 Z gs14004 Towns (IOI15_towns) C++14
61 / 100
27 ms 1348 KB
#include "towns.h"
#include <cstring>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
typedef pair<int,int> pi;
 
int dp[150][150];
 
int dist(int s, int e){
    if(s == e) return 0;
    if(s > e) swap(s,e);
    if(~dp[s][e]) return dp[s][e];
    return dp[s][e] = getDistance(s, e);
}
 
vector<pi> v;
 
int p, q, val;
bool diff(int s, int e){
    return val + dist(s, e) == dist(s, p) + dist(q, e);
}
 
int st;

int solve(int s, int e){
    if(st == 2) return 0;
    if(st == 4) return e - s + 1;
    int curp = s, cnt = 1;
    for(int i=s+1; i<=e; i++){
        if(diff(v[curp].second, v[i].second)){
            cnt--;
            if(cnt == 0){
                curp = i+1;
            }
        }
        else cnt++;
    }
    if(curp == e + 1) return 0;
    int ret = 0;
    for(int i=s; i<=e; i++){
        if(!diff(v[curp].second, v[i].second)) ret++;
    }
    return ret;
}
 
int hubDistance(int N, int sub) {
    st = sub;
    v.clear();
    memset(dp,-1,sizeof(dp));
    p = -1, val = -1, q = -1;
    for(int i=1; i<N; i++){
        if(val < dist(0, i)){
            val = dist(0, i);
            p = i;
        }
    }
    val = -1;
    for(int i=0; i<N; i++){
        if(val < dist(p, i)){
            val = dist(p, i);
            q = i;
        }
    }
    for(int i=0; i<N; i++){
        int fl = dist(p, i) - dist(q, i) + val;
        v.push_back(pi(fl / 2, i));
    }
    sort(v.begin(), v.end());
    int R = val;
    int hmin = 1e9;
    for(int i=0; i<v.size(); ){
        int e = i;
        while(e < v.size() && v[e].first == v[i].first) e++;
        int tmp = max(val - v[i].first, v[i].first);
        if(R > tmp){
            R = tmp;
            hmin = 1e9;
        }
        if(R == tmp){
            int hub = max(solve(i, e-1), max(i, (int)v.size() - e));
            hmin = min(hmin, hub);
        }
        i = e;
    }
    if(hmin > N / 2) return -R;
    return R;
}
# Verdict Execution time Memory Grader output
1 Correct 24 ms 1348 KB Output is correct
2 Correct 16 ms 1348 KB Output is correct
3 Correct 0 ms 1348 KB Output is correct
4 Correct 26 ms 1348 KB Output is correct
5 Correct 27 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 1348 KB Output is correct
2 Correct 0 ms 1348 KB Output is correct
3 Correct 24 ms 1348 KB Output is correct
4 Correct 23 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 1348 KB Output is correct
2 Correct 27 ms 1348 KB Output is correct
3 Correct 0 ms 1348 KB Output is correct
4 Correct 22 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 18 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 19 ms 1348 KB Output is correct
2 Correct 25 ms 1348 KB Output is correct
3 Correct 26 ms 1348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 1348 KB Output isn't correct
2 Halted 0 ms 0 KB -