답안 #1066090

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1066090 2024-08-19T14:58:51 Z vjudge1 공장들 (JOI14_factories) C++17
15 / 100
8000 ms 382764 KB
#include "factories.h"

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ll> vll;
typedef pair<long long, long long> pll;
typedef pair<char, ll> ci;
typedef pair<string, ll> si;
typedef long double ld;
typedef vector<ll> vi;
typedef vector<string> vs;
#define pb push_back
#define fi first
#define se second
#define whole(v) v.begin(), v.end()
#define rwhole(v) v.rbegin(), v.rend()
const ll inf = 10000000000000000;
#define fro front

vi euler_list;
vi euler_depth;
vector<pair<ii, ll>> tintout(500005, pair<ii, ll>(ii(-1, -1), 0));
vector<vector<ii>> x(500005);
ll vis[500005];
ll hi[500005];

struct segtree{
    ll dd, ht, mid;
    ll val;
    segtree *L, *R;
    segtree(ll l,ll r){
        dd = l, ht =r; mid = (dd+ht)/2;
        if(l == r){
            val = inf;
        }else{
            L = new segtree(dd, mid); R = new segtree(mid+1, ht);
            val = min(L -> val, R -> val);
        }
    }
    void update(ll pos, ll newval){
        if(dd == ht){
            val = newval;
        }else{
            if(pos <= mid){
                L -> update(pos, newval);
            }else{
                R -> update(pos, newval);
            }
            val = min(L -> val, R -> val);
        }
    }
    ll query(ll l, ll r){
        if(l == dd && r == ht) return val;
        if(r <= mid){
            return L -> query(l, r);
        }else if(l > mid){
            return R -> query(l, r);
        }
        return min(L -> query(l, mid), R -> query(mid+1, r));
    }
};
segtree tree(0, 2000005);

void euler(ll no,ll h){
    if(vis[no] != -1){
        return;
    }
    vis[no] = 1;
    hi[no] = h;
    euler_list.pb(no);
    euler_depth.pb(h);
    for(auto e:x[no]){
        euler(e.fi, h + e.se);
        euler_depth.pb(h);
        euler_list.pb(no);
    }
    return ;
}


void Init(int N, int A[], int B[], int D[]) {
    for(ll i = 0; i < N; ++i){
        x[A[i]].pb(ii(B[i], D[i]));
        x[B[i]].pb(ii(A[i], D[i]));
    }
    for(ll i = 0; i < 500005; ++i){
        tintout[i].second = i;
    }
    memset(vis, -1, sizeof vis);
    euler(0, 0);
    for(ll i = 0; i < euler_list.size(); ++i){
        if(tintout[euler_list[i]].fi.fi == -1)
            tintout[euler_list[i]].fi.fi = i;
        tintout[euler_list[i]].fi.se = i;
        
    }
    for(int i = 0; i < euler_depth.size(); ++i){
        tree.update(i, euler_depth[i]);
    }
}

long long Query(int S, int X[], int T, int Y[]) {
    ll ans = inf;
    if(S <= 12 && T <= 12){
        for(ll i = 0; i < S; ++i){
            for(ll j = 0; j < T; ++j){
                int a = tintout[X[i]].fi.fi;
                int b = tintout[Y[j]].fi.fi;
                ll l = min(a, b);
                a = tintout[X[i]].fi.se;
                b = tintout[Y[j]].fi.se;
                ll r = max(a, b);
                ll LCA = tree.query(l, r);
                if(LCA == tintout[X[i]].fi.fi || LCA == tintout[Y[i]].fi.fi){
                    ans = min(ans, abs(hi[X[i]]  - hi[Y[j]])) ;
                }
                ans = min(ans, hi[X[i]] - LCA + hi[Y[j]] - LCA);
            }
        }
    }else{
        priority_queue<ii, vector<ii>, greater<ii>> q;
        ll dist[500005];
        for(int i = 0; i < 500005; ++i){
            dist[i] = inf;
        }
        for(ll i = 0; i < S; ++i){
            q.push(ii(0, X[i]));
            dist[X[i]] = 0;
        }
        while(!q.empty()){
            ll price = q.top().fi;
            ll node = q.top().se;
            q.pop();
            if(price != dist[node]){
                continue;
            }
            for(auto e:x[node]){
                if(dist[e.fi] > dist[node] + e.se){
                    q.push(ii(price + e.se, e.fi));
                    dist[e.fi] = price + e.se;
                }
            }
        }
        for(int i = 0; i < T; ++i){
            ans = min(ans, dist[Y[i]]);
        }
    }
    return ans;
}


Compilation message

factories.cpp: In function 'void Init(int, int*, int*, int*)':
factories.cpp:95:21: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(ll i = 0; i < euler_list.size(); ++i){
      |                   ~~^~~~~~~~~~~~~~~~~~~
factories.cpp:101:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |     for(int i = 0; i < euler_depth.size(); ++i){
      |                    ~~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 276 ms 282704 KB Output is correct
2 Correct 1235 ms 299600 KB Output is correct
3 Correct 3563 ms 299608 KB Output is correct
4 Correct 2390 ms 299764 KB Output is correct
5 Correct 1183 ms 299448 KB Output is correct
6 Correct 1179 ms 299652 KB Output is correct
7 Correct 3424 ms 299596 KB Output is correct
8 Correct 2773 ms 299600 KB Output is correct
9 Correct 1146 ms 299524 KB Output is correct
10 Correct 1147 ms 299620 KB Output is correct
11 Correct 3396 ms 299700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 162 ms 282292 KB Output is correct
2 Correct 3380 ms 364652 KB Output is correct
3 Correct 3267 ms 364696 KB Output is correct
4 Correct 3355 ms 377064 KB Output is correct
5 Correct 3695 ms 382764 KB Output is correct
6 Correct 3343 ms 367896 KB Output is correct
7 Execution timed out 8057 ms 316448 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 276 ms 282704 KB Output is correct
2 Correct 1235 ms 299600 KB Output is correct
3 Correct 3563 ms 299608 KB Output is correct
4 Correct 2390 ms 299764 KB Output is correct
5 Correct 1183 ms 299448 KB Output is correct
6 Correct 1179 ms 299652 KB Output is correct
7 Correct 3424 ms 299596 KB Output is correct
8 Correct 2773 ms 299600 KB Output is correct
9 Correct 1146 ms 299524 KB Output is correct
10 Correct 1147 ms 299620 KB Output is correct
11 Correct 3396 ms 299700 KB Output is correct
12 Correct 162 ms 282292 KB Output is correct
13 Correct 3380 ms 364652 KB Output is correct
14 Correct 3267 ms 364696 KB Output is correct
15 Correct 3355 ms 377064 KB Output is correct
16 Correct 3695 ms 382764 KB Output is correct
17 Correct 3343 ms 367896 KB Output is correct
18 Execution timed out 8057 ms 316448 KB Time limit exceeded
19 Halted 0 ms 0 KB -