제출 #113450

#제출 시각아이디문제언어결과실행 시간메모리
113450popovicirobert공장들 (JOI14_factories)C++14
100 / 100
4790 ms224356 KiB
#include "factories.h"
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const ll INF = 1e18;

struct SegTree {

    vector <ll> aint;
    int n;

    inline void init(int _n) {
        n = _n;
        aint.resize(2 * n, INF);
    }

    inline void refresh(int nod) {
        aint[nod] = min(aint[2 * nod], aint[2 * nod + 1]);
    }

    inline void update(int pos, ll val) {
        pos += n;
        aint[pos] = val;

        while(pos > 1) {
            pos >>= 1;
            refresh(pos);
        }

    }

    inline ll query(int l, int r) {
        l += n, r += n;

        ll ans = INF;

        while(l < r) {
            if(l & 1) {
                ans = min(ans, aint[l]);
                l++;
            }
            if(r & 1) {
                r--;
                ans = min(ans, aint[r]);
            }

            l >>= 1;
            r >>= 1;
        }

        return ans;
    }

}sta, stb;

vector < vector < pair <int, int> > > g;
vector <ll> dst;
vector <int> idl, idr, first, lvl, lg;

vector < vector <int> > rmq;

void dfs(int nod, int par, int &id, int &sz) {

    lvl[nod] = lvl[par] + 1;
    idl[nod] = id++;

    rmq[++sz][0] = nod;
    first[nod] = sz;

    for(auto it : g[nod]) {
        if(it.first != par) {
            dst[it.first] = dst[nod] + it.second;
            dfs(it.first, nod, id, sz);
            rmq[++sz][0] = nod;
        }
    }

    idr[nod] = id;
}

int n;

void Init(int _n, int A[], int B[], int D[]) {

    n = _n;

    g.resize(n + 1);
    int i;

    for(i = 0; i < n - 1; i++) {
        A[i]++, B[i]++;
        g[A[i]].push_back({B[i], D[i]});
        g[B[i]].push_back({A[i], D[i]});
    }

    dst.resize(n + 1), idl.resize(n + 1), idr.resize(n + 1), first.resize(n + 1), lvl.resize(n + 1);
    rmq.resize(2 * n + 1, vector <int>(20));

    int id = 0, sz = 0;
    dfs(1, 0, id, sz);

    lg.resize(sz + 1);
    for(i = 2; i <= sz; i++) {
        lg[i] = lg[i >> 1] + 1;
    }

    for(int bit = 1; (1 << bit) <= sz; bit++) {
        for(i = 1; i + (1 << bit) <= sz + 1; i++) {
            int a = rmq[i][bit - 1], b = rmq[i + (1 << (bit - 1))][bit - 1];

            if(lvl[a] < lvl[b]) {
                rmq[i][bit] = a;
            }
            else {
                rmq[i][bit] = b;
            }
        }
    }

    sta.init(n), stb.init(n);

}

inline int get(int x, int y) {
    x = first[x], y = first[y];
    if(x > y) swap(x, y);

    int bit = lg[y - x + 1];

    if(lvl[rmq[x][bit]] < lvl[rmq[y - (1 << bit) + 1][bit]]) {
        return rmq[x][bit];
    }
    return rmq[y - (1 << bit) + 1][bit];
}



ll Query(int S, int X[], int T, int Y[]) {

    int i;

    for(i = 0; i < S; i++) {
        X[i]++;
        sta.update(idl[X[i]], dst[X[i]]);
    }
    for(i = 0; i < T; i++) {
        Y[i]++;
        stb.update(idl[Y[i]], dst[Y[i]]);
    }

    static vector <int> nodes;
    nodes.clear();

    for(i = 0; i < S; i++) {
        nodes.push_back(X[i]);
    }
    for(i = 0; i < T; i++) {
        nodes.push_back(Y[i]);
    }

    sort(nodes.begin(), nodes.end(), [&](const int &a, const int &b) {

                return idl[a] < idl[b];

         });

    ll ans = INF;

    for(i = 0; i + 1 < nodes.size(); i++) {
        int nod = get(nodes[i], nodes[i + 1]);

        ans = min(ans, sta.query(idl[nod], idr[nod]) + stb.query(idl[nod], idr[nod]) - 2 * dst[nod]);
    }

    for(i = 0; i < S; i++) {
        sta.update(idl[X[i]], INF);
    }
    for(i = 0; i < T; i++) {
        stb.update(idl[Y[i]], INF);
    }

    return ans;
}

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

factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:171:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i = 0; i + 1 < nodes.size(); i++) {
                ~~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...