Submission #1243642

#TimeUsernameProblemLanguageResultExecution timeMemory
1243642moondarksideTowns (IOI15_towns)C++20
13 / 100
9 ms328 KiB
#include<bits/stdc++.h>
using namespace std;

int getDistance(int i,int j);

int hubDistance(int N,int sub){
    int D1=0;
    int maxD=0;
    for(int i=1;i<N;i++){
        int d=getDistance(0,i);
        if(d>maxD){
            maxD=d;
            D1=i;
        }
    }
    
    std::vector<int> Distances;
    
    maxD=0;
    int D2=0;
    for(int i=0;i<N;i++){
        int d=getDistance(D1,i);
        if(d>maxD){
            maxD=d;
            D2=i;
        }
        Distances.push_back(d);
    }
    
    int R=100000000;
    
    std::vector<int> Distances2;
    vector<int> Hubs;
    
    for(int i=0;i<N;i++){
        int d=getDistance(D2,i);
        Distances2.push_back(d);
        int k=(d+Distances[i]-maxD)/2;
        int d1=Distances[i]-k;
        int d2=d-k;
        d=max(d1,d2);
        
        if(d<R){
            Hubs.clear();
            Hubs.push_back(d1);
        }
        if(d==R && Hubs[0]!=d1 && Hubs.size()<2){
            Hubs.push_back(d1);
        }
        
        R=min(R,d);
        
    }
    
    
    vector<pair<int,int>> LRn(Hubs.size());
    vector<vector<int>> Middle(Hubs.size());
    
    for(int i=0;i<N;i++){
        int d=Distances2[i];
        int k=(d+Distances[i]-maxD)/2;
        int d1=Distances[i]-k;
        
        for(int j=0;j<Hubs.size();j++){
            if(Hubs[j]<d1){
                LRn[j].first+=1;
            }
            
            if(Hubs[j]>d1){
                LRn[j].second+=1;
            }
            
            if(Hubs[j]==d1){
                Middle[j].push_back(i);
            }
            
            
        }
        
    }

    
    for(int i=0;i<Hubs.size();i++){
        if(LRn[i].first>N/2 || LRn[i].second>N/2 || Middle[i].size()>N/2){
           
           if(LRn[i].first<=N/2 && LRn[i].second<=N/2){
            stack<int> Current;
            vector<int> Mid=Middle[i];
            for(int j=0;j<Mid.size();j++){
                if(Current.empty()){
                    Current.push(j);
                }
                else{
                    int top=Current.top();
                    int k=(Distances[top]+Distances2[top]-maxD)/2;
                    int d=getDistance(top,Mid[j]);
                    int SD=d-(Distances[Mid[j]]+d-Distances[top])/2;
                    if(SD<k){
                        Current.push(j);
                    }
                    else{
                        Current.pop();
                    }
                    
                }
            }
            
            if(Current.empty()){
                return R;
            }
            
            int am=0;
            
            for(int j=0;j<Mid.size();j++){
                int top=Current.top();
                int k=(Distances[top]+Distances2[top]-maxD)/2;
                int d=getDistance(top,Mid[j]);
                int SD=d-(Distances[Mid[j]]+d-Distances[top])/2;
                if(SD<k){
                    am++;
                }
    
            }
             
               
            if(am>N/2){
                return -R;
            }   
            return R;
               
           }
           
        }
        else{
            return R;
        }
        
        
    }
    
    
    
    return -R;
    
    
    
}
#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...