Submission #522799

#TimeUsernameProblemLanguageResultExecution timeMemory
522799DeepessonDreaming (IOI13_dreaming)C++17
100 / 100
519 ms15680 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
#define MAX 105000
typedef std::pair<int,int> pii;
std::vector<pii> con[MAX];
bool foi[MAX];
int visitou[MAX]={};
int turno=42;
int mais_distante(int x){
    std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;
    queue.push({0,x});
    int last=0;
    ++turno;
    while(queue.size()){
        auto __ = queue.top();
        queue.pop();
        if(visitou[__.second]==turno)continue;
        visitou[__.second]=turno;
        last=__.second;
        for(auto&x:con[__.second])queue.push({__.first+x.second,x.first});
    }
    return last;
}
int maior_distancia(int x){
    std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;
    queue.push({0,x});
    int last=0;
    ++turno;
    while(queue.size()){
        auto __ = queue.top();
        queue.pop();
        if(visitou[__.second]==turno)continue;
        visitou[__.second]=turno;
        last=__.first;
        for(auto&x:con[__.second])queue.push({__.first+x.second,x.first});
    }
    return last;
}
std::vector<int> marcar(int x){
    std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;
    queue.push({0,x});
    std::vector<int> v;
    ++turno;
    while(queue.size()){
        auto __ = queue.top();
        queue.pop();
        if(visitou[__.second]==turno)continue;
        visitou[__.second]=turno;
        v.push_back(__.second);
        foi[__.second]=true;
        for(auto&x:con[__.second])queue.push({__.first+x.second,x.first});
    }
    return v;
}
int maiordist[MAX]={};
int meio(int x){
    int ponta1 = mais_distante(mais_distante(x));
    int ponta2 = mais_distante(ponta1);
    std::vector<int> checar;
    {
        std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;
        queue.push({0,ponta1});
        ++turno;
        while(queue.size()){
            auto __ = queue.top();
            queue.pop();
            if(visitou[__.second]==turno)continue;
            visitou[__.second]=turno;
            checar.push_back(__.second);
            maiordist[__.second]=__.first;
            for(auto&x:con[__.second])queue.push({__.first+x.second,x.first});
        }
    }
    {
        std::priority_queue<pii,std::vector<pii>,std::greater<pii>> queue;
        queue.push({0,ponta2});
        ++turno;
        while(queue.size()){
            auto __ = queue.top();
            queue.pop();
            if(visitou[__.second]==turno)continue;
            visitou[__.second]=turno;
            maiordist[__.second]=std::max(maiordist[__.second],__.first);
            for(auto&x:con[__.second])queue.push({__.first+x.second,x.first});
        }
    }
    int best=-1;
    int val=1e9+7;
    for(auto&x:checar){
        if(maiordist[x]<val){
            val=maiordist[x];
            best=x;
        }
    }
    return best;
}
int travelTime(int N,int M,int L,int A[],int B[],int T[]){
    for(int i=0;i!=M;++i){
        con[A[i]].push_back({B[i],T[i]});
        con[B[i]].push_back({A[i],T[i]});
    }
    std::vector<std::vector<int>> vec;
    for(int i=0;i!=N;++i){
        if(foi[i])continue;
        vec.push_back(marcar(i));
    }
    std::vector<pii> meios;
    for(auto&x:vec){
        int k = meio(x[0]);
        meios.push_back({maior_distancia(k),meio(x[0])});
    }
    std::sort(meios.begin(),meios.end(),std::greater<pii>());
    for(int i=1;i<meios.size();++i){
        con[meios[i].second].push_back({meios[0].second,L});
        con[meios[0].second].push_back({meios[i].second,L});
    }
    return maior_distancia(mais_distante(mais_distante(0)));
}

Compilation message (stderr)

dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:113:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |     for(int i=1;i<meios.size();++i){
      |                 ~^~~~~~~~~~~~~
#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...