Submission #420020

#TimeUsernameProblemLanguageResultExecution timeMemory
420020jlallas384Dreaming (IOI13_dreaming)C++17
100 / 100
181 ms34984 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
const int N = 100100;
vector<int> dp[N],pre[N],suf[N];
vector<pair<int,int>> g[N];
int mx[N],vis[N];

void dfs1(int v,int p){
    vis[v] = 1;
    for(auto [u,w]: g[v]) if(u != p){
        dfs1(u,v);
        dp[v].push_back(w + mx[u]);
    }
    if(dp[v].size()) mx[v] = *max_element(dp[v].begin(), dp[v].end());
}

vector<int> mins;
int ans = 0;
void dfs2(int v,int p,int id,int bw){
    if(p != -1){
        int prMx = (id == 0 ? 0 : pre[p][id - 1]);
        int suMx = (id == (int) suf[p].size() - 1 ? 0 : suf[p][id + 1]);
        dp[v].push_back(max(prMx,suMx) + bw);
    }
    if(g[v].empty()){
        mins.back() = 0;
        return;
    }
    ans = max(ans,*max_element(dp[v].begin(),dp[v].end()));
    mins.back() = min(mins.back(),*max_element(dp[v].begin(), dp[v].end()));
    pre[v].resize(dp[v].size());
    suf[v].resize(dp[v].size());
    pre[v][0] = dp[v][0], suf[v].back() = dp[v].back();
    for(int i = 1; i < dp[v].size(); i++){
        pre[v][i] = max(pre[v][i-1],dp[v][i]);
    }
    for(int i = (int) dp[v].size() - 2; i >= 0; i--){
        suf[v][i] = max(suf[v][i+1],dp[v][i]);
    }
    int ch = 0;
    for(auto [u,w]: g[v]) if(u != p){
        dfs2(u,v,ch++,w);
    }
}

int travelTime(int n, int m, int l, int A[], int B[], int T[]) {
    for(int i = 0; i < m; i++){
        g[A[i]].emplace_back(B[i],T[i]);
        g[B[i]].emplace_back(A[i],T[i]);
    }
    for(int i = 0; i < n; i++) if(!vis[i]){
        mins.push_back(1e9);
        dfs1(i,-1);
        dfs2(i,-1,0,0);
    }
    sort(mins.rbegin(), mins.rend());
    int maxP = mins[0];
    for(int i = 1; i < mins.size(); i++){
        ans = max(ans,maxP + l + mins[i]);
        maxP = max(maxP,mins[i] + l);
    }
    return ans;
}

Compilation message (stderr)

dreaming.cpp: In function 'void dfs2(int, int, int, int)':
dreaming.cpp:35:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |     for(int i = 1; i < dp[v].size(); i++){
      |                    ~~^~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:59:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |     for(int i = 1; i < mins.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...