제출 #764136

#제출 시각아이디문제언어결과실행 시간메모리
764136fatemetmhrDreaming (IOI13_dreaming)C++17
100 / 100
55 ms17292 KiB
//  ~ Be Name Khoda ~  //

#include "dreaming.h"
#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,Ofast")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second

const int maxn  =  1e6   + 10;
const int maxn5 =  2e5   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   + 7;
const ll  inf   =  1e18;

vector <pair<int, int>> adj[maxn5];
vector <int> ver, av;
int par[maxn5], h[maxn5], edpar[maxn5];
bool mark[maxn5];

void dfs1(int v){
    mark[v] = true;
    av.pb(v);
    for(auto [u, w] : adj[v]) if(!mark[u]){
        h[u] = h[v] + w;
        dfs1(u);
    }
}

void dfs2(int v){
    mark[v] = true;
    for(auto [u, w] : adj[v]) if(!mark[u]){
        h[u] = h[v] + w;
        par[u] = v;
        edpar[u] = w;
        dfs2(u);
    }
}

int travelTime(int n, int m, int l, int a[], int b[], int t[]) {
    for(int i = 0; i < m; i++){
        adj[a[i]].pb({b[i], t[i]});
        adj[b[i]].pb({a[i], t[i]});
    }
    int ans = 0;

    for(int i = 0; i < n; i++) if(!mark[i]){
        av.clear();
        h[i] = 0;
        dfs1(i);
        if(av.size() == 1){
            ver.pb(0);
            continue;
        }
        int dim1 = i;
        for(auto u : av){
            mark[u] = false;
            if(h[u] >= h[dim1])
                dim1 = u;
        }
        h[dim1] = 0;
        par[dim1] = -1;
        edpar[dim1] = 0;
        dfs2(dim1);
        int dim2 = i;
        for(auto u : av) if(h[u] >= h[dim2])
            dim2 = u;
        ans = max(ans, h[dim2]);
        int x = h[dim2], y = 0, v = dim2;
        while(par[v] != -1){
            int u = par[v];
            if(x - edpar[v] >= y + edpar[v]){
                x -= edpar[v];
                y += edpar[v];
                v = u;
            }
            else
                break;
        }
        int u = par[v];
        int x2 = x - edpar[v], y2 = y + edpar[v];
        ver.pb(min(max(x2, y2), max(x, y)));
        //cout << "having one " << dim1 << ' ' << dim2 << ' ' << v << ' ' << u << ' ' << x << ' ' << y << ' ' << x2 << ' ' << y2 << endl;
    }
    if(ver.size() == 1)
        return ans;
    if(ver.size() == 2){
        ans = max(ans, ver[0] + ver[1] + l);
        return ans;
    }
    sort(all(ver));
    int x = ver.back(), y = ver[int(ver.size()) - 2], z = ver[int(ver.size()) - 3];
    return max({ans, x + l + y, 2 * l + y + z});
}

컴파일 시 표준 에러 (stderr) 메시지

dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:90:13: warning: unused variable 'u' [-Wunused-variable]
   90 |         int u = par[v];
      |             ^
#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...