Submission #1369862

#TimeUsernameProblemLanguageResultExecution timeMemory
1369862luka2881Dreaming (IOI13_dreaming)C++20
100 / 100
235 ms35504 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
int posecen[100005];
vector<vector<int>>a(100005);
map<pair<int,int>,int>mapa;
int val[100005];
static void dfs(int k,int &maxd,int &d,int dubina,vector<int>&pom)
{
    posecen[k]=true;
    if(dubina>maxd)
    {
        maxd=dubina;
        d=k;
    }
    pom.push_back(k);
    for(int i=0;i<a[k].size();i++)
    {
        if(!posecen[a[k][i]])
        {
            dfs(a[k][i],maxd,d,dubina+mapa[make_pair(k,a[k][i])],pom);
        }
    }
}
static void nadjiprecnik(int k,int t,vector<int>&precnik,bool &nadjen)
{
    posecen[k]=true;
    if(k==t)
    {
        precnik.push_back(t);
        nadjen=true;
        return;
    }
    for(int i=0;i<a[k].size();i++)
    {
        if(!posecen[a[k][i]])
        {
            nadjiprecnik(a[k][i],t,precnik,nadjen);
            if(nadjen)
            {
                precnik.push_back(k);
                return;
            }
        }
    }
}
int travelTime(int N, int M, int L,int A[], int B[], int T[])
{
    for(int i=0;i<N;i++)posecen[i]=false;
    for(int i=0;i<M;i++)
    {
        a[A[i]].push_back(B[i]);
        a[B[i]].push_back(A[i]);
        mapa[make_pair(A[i],B[i])]=T[i];
        mapa[make_pair(B[i],A[i])]=T[i];
    }
    vector<pair<int,int>>niz;
    for(int i=0;i<N;i++)
    {
        if(!posecen[i])
        {
            if(a[i].size()==0)
            {
                niz.push_back(make_pair(0,0));
                posecen[i]=true;
                continue;
            }
            int maxd=0;
            vector<int>pom;
            vector<int>pom1;
            int k1=i;
            dfs(i,maxd,k1,0,pom);
            for(int j=0;j<pom.size();j++)posecen[pom[j]]=false;
            maxd=0;
            int k2=k1;
            dfs(k1,maxd,k2,0,pom1);
            for(int j=0;j<pom1.size();j++)posecen[pom1[j]]=false;
            vector<int>precnik;
            bool nadjen=false;
            int r=maxd;
            nadjiprecnik(k1,k2,precnik,nadjen);
            for(int j=0;j<precnik.size();j++)posecen[precnik[j]]=false;
            for(int j=0;j<pom.size();j++)posecen[pom[j]]=true;
            int mind=INT_MAX;
            int x=0;
            int num1=0,num2=0;
            for(int j=0;j<(int)precnik.size()-1;j++)
            {
                pair<int,int> z=make_pair(precnik[j],precnik[j+1]);
                x+=mapa[z];
                if(abs(x-(r-x))<mind)
                {
                    mind=abs(x-(r-x));
                    num1=x;
                    num2=r-x;
                }
            }
            pair<int,int>z=make_pair(max(num1,num2),min(num1,num2));
            niz.push_back(z);
        }
    }
    sort(niz.begin(),niz.end());
    reverse(niz.begin(),niz.end());
    int maxval=niz[0].first+niz[0].second;
    if(niz.size()>1)
    {
        maxval=max(maxval,niz[0].first+L+niz[1].first);
    }
    if(niz.size()>2)
    {
        maxval=max(maxval,niz[1].first+2*L+niz[2].first);
    }
    return maxval;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...