제출 #975097

#제출 시각아이디문제언어결과실행 시간메모리
975097Amaarsaa경주 (Race) (IOI11_race)C++11
100 / 100
505 ms41280 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <chrono>
#include <cmath>
#pragma GCC optimize("Ofast")
#pragma GCC optimization ("unroll-loops")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;

typedef int_fast8_t  int8;
typedef int_fast16_t int16;
typedef int_fast32_t int32;
typedef int_fast64_t int64;
typedef int_fast64_t ll;

typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<ll, ll>   pll;
typedef pair<ll, pll>  plll;

#define PB push_back
#define PF push_front
#define MP make_pair
#define FF first
#define SS second

namespace hash0 {
    const double PI = acos(-1);

    struct chash { 
        const uint64_t C = ll(2e18*PI)+71; 
        const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count(); 

        inline ll operator()(ll x) const { return __builtin_bswap64((x ^ RANDOM) * C); }

        inline ll operator()(pii p) const { return __builtin_bswap64((p.FF ^ RANDOM) * C) + p.SS; }
    };

    template<class K, class V> 
    using fast_map = gp_hash_table<K, V, chash>;

    template<class K> 
    using fast_set = fast_map<K, null_type>;
}

using namespace hash0;

template<typename T1, typename T2>
ostream& operator<<(ostream& os, const pair<T1, T2>& p) {
    return os << '(' << p.FF << ", " << p.SS << ')';
}

template<typename T1, typename T2>
ostream& operator<<(ostream& os, const fast_map<T1, T2>& s) {
    os << '[';
    if (s.size()) {
        os << *s.begin();
        for (auto i = ++s.begin(); i != s.end(); i++)
            os << ", " << (*i);
    }
    return os << ']';
}

int N, K;
vector<pii> adj[200005];

int W[200005];
bool R[200005];

int dfs_w(int u, int p) {
    W[u] = 1;
    for (pii v : adj[u])
        if (v.FF != p && !R[v.FF])
            W[u] += dfs_w(v.FF, u);
    return W[u];
}

int centroid(int u, int n, int p) {
    for (pii v : adj[u])
        if (v.FF != p && !R[v.FF])
            if (W[v.FF] * 2 > n)
                return centroid(v.FF, n, u);
    return u;
}

int ans = 2000000011;
vector<pii> V;

void dfs_u(int u, int p, int d, int t) {
    if (d > K || t > ans)
        return;
    
    V.PB(MP(d, t));

    for (pii v : adj[u])
        if (v.FF != p && !R[v.FF])
            dfs_u(v.FF, u, d + v.SS, t + 1);
}

void init_cd(int u) {
    u = centroid(u, dfs_w(u, -1), -1);

    fast_map<int, int> M;
    for (pii v : adj[u]) {
        if (R[v.FF])
            continue;
        dfs_u(v.FF, u, v.SS, 1);
        for (pii x : V) {
	        if (M.find(K - x.FF) != M.end()) 
		        ans = min(ans, M[K - x.FF] + x.SS);
	        else if (x.FF == K) 
		        ans = min(ans, x.SS);
	    }
	    for (pii x : V) {
	        if (M.find(x.FF) == M.end()) 
		        M[x.FF] = x.SS;
	        else 
		        M[x.FF] = min(M[x.FF], x.SS);
	    }
	    V.clear();
    }

    R[u] = 1;
    for (pii v : adj[u])
        if (!R[v.FF])
            init_cd(v.FF);
}

int best_path(int n, int k, int h[][2], int l[]) {
    N = n, K = k;
    for (int i = 0; i < n - 1; i++) {
        adj[h[i][0]].PB(MP(h[i][1], l[i]));
        adj[h[i][1]].PB(MP(h[i][0], l[i]));
    }
    init_cd(0);
    return ans == 2000000011 ? -1 : ans;
}

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

race.cpp:7: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    7 | #pragma GCC optimization ("unroll-loops")
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...