제출 #635466

#제출 시각아이디문제언어결과실행 시간메모리
635466Ronin13공장들 (JOI14_factories)C++14
100 / 100
2909 ms132360 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
using namespace std;

const int NMAX = 5e5 + 1;
ll linf = 1e18;

vector <vector <pll> > g(NMAX);
vector <ll> d(NMAX);
vector <int> head(NMAX);
vector <int> sz(NMAX);
vector <int> p(NMAX);

void dfs(int v, int e = -1){
    sz[v] = 1;
    p[v] = e;
    for(auto x : g[v]){
        int to = x.f;
        ll len = x.s;
        if(to == e) continue;
        d[to] = d[v] + len;
        dfs(to, v);
        sz[v] += sz[to];
    }
}

//vector <vector <int> > path(NMAX);
vector <int> lead(NMAX);
vector <ll> mn(NMAX, linf);

vector <pair<pll, pii> > vec;

void lift(int x, int ind){
    int cur = x;
    while(x != -1){
        vec.pb({{d[x], d[cur]}, {lead[x], ind}});
        x = lead[x]; x = p[x];
    }
}

void prep(int v, int head, int e = -1){
    lead[v] = head;
    for(auto x : g[v]){
        int to = x.f;
        if(to == e) continue;
        if(sz[to] * 2 > sz[v]){
            prep(to, head, v);
        }
        else prep(to, to, v);
    }
}

ll cur[NMAX][2];

int n;

void Init(int N, int A[], int B[], int D[]) {
    n = N;
    for(int i = 0; i < n - 1; i++){
        g[A[i]].pb({B[i], D[i]});
        g[B[i]].pb({A[i], D[i]});
    }
    dfs(0);
    prep(0, 0);
    for(int i = 0; i <= n; i++){
        cur[i][0] = cur[i][1] = 1e18;
    }
}

long long Query(int S, int X[], int T, int Y[]) {
    ll ans = linf;
    for(int i = 0; i < S; i++){
        lift(X[i], 0);
    }
    for(int i = 0; i < T; i++){
        lift(Y[i], 1);
    }
    sort(vec.begin(), vec.end());
    reverse(vec.begin(), vec.end());
    for(int i = 0; i < vec.size(); i++){
        int ind = vec[i].s.s;
        ll v = vec[i].f.f, xx = vec[i].f.s;
        int lll = vec[i].s.f;
        ans = min(ans, cur[lll][ind ^ 1] + xx - 2 * v);
        cur[lll][ind] = min(cur[lll][ind], xx);
    }
    for(int i = 0; i < vec.size(); i++){
        int lll = vec[i].s.f;
        cur[lll][1] = cur[lll][0] = linf;
    }
    vec.clear();
    return ans;
}

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

factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:88:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |     for(int i = 0; i < vec.size(); i++){
      |                    ~~^~~~~~~~~~~~
factories.cpp:95:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int i = 0; i < vec.size(); i++){
      |                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...