Submission #1156730

#TimeUsernameProblemLanguageResultExecution timeMemory
1156730fatman87878Dreaming (IOI13_dreaming)C++20
100 / 100
66 ms26124 KiB
#include "dreaming.h"
#include<bits/stdc++.h>
using namespace std;
#define IOS cin.tie(nullptr)->sync_with_stdio(0);//,cin.exceptions(cin.failbit);
#define lb(x) (x)&-(x)
#define all(x) (x).begin(),(x).end()
#define ll long long

constexpr int maxN=1e5+5;

int n,m,l,dp[maxN],ans;

bitset<maxN> vis;

vector<pair<int,int>> adj[maxN];

void dfs(int now,int last){
    dp[now] = 0;
    vis[now] = 1;
    for(auto [i,c]:adj[now])if(i!=last){
        dfs(i,now);
        ans = max(ans,dp[now]+dp[i]+c);
        if(dp[i]+c>dp[now])dp[now] = dp[i]+c;
    }
}

int dfs2(int now,int last,int val){
    int ret = max(val,dp[now]);
    vector<int> pref(1,0);
    for(auto [i,c]:adj[now])if(i!=last)pref.emplace_back(max(pref.back(),dp[i]+c));
    reverse(all(adj[now]));
    for(auto [i,c]:adj[now])if(i!=last){
        pref.pop_back();
        ret = min(ret,dfs2(i,now,max(val,pref.back())+c));
        val = max(val,dp[i]+c);
    }
    return ret;
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
    ans = 0;
    for(int i = 0;i<n;i++)adj[i].clear(),vis[i] = 0;
    for(int a,b,c;m--;){
        a = A[m],b = B[m],c = T[m];
        adj[a].emplace_back(b,c);
        adj[b].emplace_back(a,c);
    }
    vector<int> res;
    for(int i = 0;i<n;i++)if(!vis[i]){
        dfs(i,i);
        int ret = dfs2(i,i,0);
        for(int j = 0;j<3&&j<res.size();j++)if(res[j]<ret)swap(res[j],ret);
        if(res.size()<3)res.emplace_back(ret);
    }
    if(res.size()>1)ans = max(ans,res[0]+res[1]+l);
    if(res.size()>2)ans = max(ans,res[1]+res[2]+2*l);
    return ans;
}
#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...