#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);
}
stack<int> stk;
int st;
struct disj{
int pa[111], sz[111];
void init(int n){
for(int i=0; i<=n; i++) pa[i] = i, sz[i] = 1;
}
int find(int x){
return pa[x] = (pa[x] == x ? x : find(pa[x]));
}
void uni(int p, int q){
p = find(p), q = find(q);
if(p == q) return;
pa[q] = p;
sz[p] += sz[q];
}
}disj;
int solve(int s, int e){
if(st == 2) return 0;
if(st == 4) return e - s + 1;
while(!stk.empty()) stk.pop();
for(int i=s; i<=e; i++){
if(stk.empty()){
s.push(v[i].second);
}
else if(diff(stk.top(), v[i].second)){
stk.pop();
}
else{
stk.push(v[i].second);
}
}
if(stk.empty()) return 0;
int cnt = 0;
for(int i=s; i<=e; i++){
if(!diff(stk.top(), i)) cnt++;
}
return cnt;
}
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;
}
Compilation message
towns.cpp: In member function ‘void disj::uni(int, int)’:
towns.cpp:36:24: warning: declaration of ‘q’ shadows a global declaration [-Wshadow]
void uni(int p, int q){
^
towns.cpp:20:8: note: shadowed declaration is here
int p, q, val;
^
towns.cpp:36:24: warning: declaration of ‘p’ shadows a global declaration [-Wshadow]
void uni(int p, int q){
^
towns.cpp:20:5: note: shadowed declaration is here
int p, q, val;
^
towns.cpp: In function ‘int solve(int, int)’:
towns.cpp:50:6: error: request for member ‘push’ in ‘s’, which is of non-class type ‘int’
s.push(v[i].second);
^
towns.cpp: In function ‘int hubDistance(int, int)’:
towns.cpp:92:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0; i<v.size(); ){
^
towns.cpp:94:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
while(e < v.size() && v[e].first == v[i].first) e++;
^