Submission #1243567

#TimeUsernameProblemLanguageResultExecution timeMemory
1243567moondarksideTowns (IOI15_towns)C++20
13 / 100
10 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){
               vector<int> Mid=Middle[i];
               while(true){
                int elements=1;
                int split=Mid.back();
                Mid.pop_back();
                vector<int> Other;
                int k=(Distances2[split]+Distances[split]-maxD)/2;
                int l=k+Distances[split];
                
                while(elements+Mid.size()>N/2) {
                    int i=Mid.back();
                    Mid.pop_back();
                    int D=getDistance(split,i);
                    int d=D-(D+Distances[i]-l)/2;
                    if(d<k){
                        elements++;
                    }
                    else{
                        Other.push_back(i);
                    }
                    
                    if(elements>N/2){
                        return -R;
                    }
                   
                   
               }
               
               
               
               if(Other.size()<N/2){
                   return R;
               }
               
               Mid=Other;
               
           }
           
           }
        }
        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...