답안 #772151

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
772151 2023-07-03T17:09:47 Z Essa2006 공장들 (JOI14_factories) C++14
100 / 100
5709 ms 138948 KB
#include "factories.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define FF first
#define SS second
#define all(a) a.begin(), a.end()
#define mod (ll)(1000000007)
#define MAX_N          500000
// #define MAX_Q          100000
// #define MAX_SUM_ST    1000000
// #define MAX_VALUE  1000000000
// static int N, Q;
// static int A[MAX_N], B[MAX_N], D[MAX_N];
// static int S[MAX_N];
// static int T[MAX_N];
// static int X[MAX_SUM_ST];
// static int Y[MAX_SUM_ST];
// static int Qx[MAX_N];
// static int Qy[MAX_N];
 
const ll inf=1e15, lg=19;
int n;
ll Dis[MAX_N];
int dpth[MAX_N];
vector<vector<int>>BB(MAX_N), AA(MAX_N);
int up[MAX_N][lg+1];

void pre(){
    for(int i=0;i<MAX_N;i++){
        Dis[i]=inf, dpth[i]=2*n;
    }
}

void bfs(int ind){
    queue<int>q;
    q.push(ind);
    up[ind][0]=ind;
    Dis[ind]=dpth[ind]=0;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int j=1;j<=lg;j++){
             up[u][j]=up[up[u][j-1]][j-1];
             if(up[u][j]==0)
                break;
        }
        for(int i=0;i<AA[u].size();i++){
            int v=AA[u][i];
            if(dpth[u]+1<dpth[v]){
                dpth[v]=dpth[u]+1, Dis[v]=Dis[u]+BB[u][i];
                up[v][0]=u;
                q.push(v);
            }
        }
    }
}
int lca(int u, int v){
    // u
 
    // v
    if(dpth[u]>dpth[v])
        swap(u, v);
    for(int j=lg;j>=0;j--){
        if(dpth[up[v][j]]>=dpth[u])
            v=up[v][j];
    }
    if(u==v)
        return u;
    for(int j=lg;j>=0;j--){
        if(up[u][j]!=up[v][j])
            u=up[u][j], v=up[v][j];
    }
    return up[v][0];
}
inline ll get_dis(int u, int v){
    return Dis[u]+Dis[v]-2*Dis[lca(u, v)];
}
void Init(int N, int A[], int B[], int D[]) {
    n=N;
    pre();
    for(int i=0;i<n-1;i++){
        int u=A[i], v=B[i], w=D[i];
        AA[u].push_back(v);
        AA[v].push_back(u);
        BB[u].push_back(w);
        BB[v].push_back(w);
    }
    bfs(0);
}
 
long long Query(int S, int X[], int T, int Y[]) {
    if(S>20 && T>20){
        vector<ll>D(n, inf);
        vector<bool>In_y(n, 0), Vis(n, 0);
        for(int i=0;i<T;i++){
            In_y[Y[i]]=1;
        }
        priority_queue<array<ll, 2>>q;
        for(int i=0;i<S;i++){
            q.push({0, X[i]});
            D[X[i]]=0;
        }
        while(!q.empty()){
            int u=q.top()[1];
            q.pop();
            if(Vis[u])
                continue;
            Vis[u]=1;
            if(In_y[u])
                return D[u];
            for(int i=0;i<AA[u].size();i++){
                int v=AA[u][i], w=BB[u][i];
                if(D[u]+w<D[v]){
                    D[v]=D[u]+w;
                    q.push({-D[v], v});
                }
            }
        }
    }
    ll ans=inf;
    for(int i=0;i<S;i++){
        for(int j=0;j<T;j++){
            ans=min(ans, get_dis(X[i], Y[j]));
        }
    }
    return ans;
}
// int main() {
// 
//   int i, j, k;
//   int STop, TTop;
// 
//   if (2 != scanf("%d%d", &N, &Q)) {
//     fprintf(stderr, "error: cannot read N and Q.\n");
//     exit(1);
//   }
//   if (!(2 <= N && N <= MAX_N)) {
//     fprintf(stderr, "error: N is out of bounds.\n");
//     exit(1);
//   }
//   if (!(1 <= Q && Q <= MAX_Q)) {
//     fprintf(stderr, "error: Q is out of bounds.\n");
//     exit(1);
//   }
//   for (i = 0; i < N - 1; ++i) {
//     if (1 != scanf("%d", &A[i])) {
//       fprintf(stderr, "error: cannot read A[%d].\n", i);
//       exit(1);
//     }
//     if (!(0 <= A[i] && A[i] <= N - 1)) {
//       fprintf(stderr, "error: A[%d] is out of bounds.\n", i);
//       exit(1);
//     }
//     if (1 != scanf("%d", &B[i])) {
//       fprintf(stderr, "error: cannot read B[%d].\n", i);
//       exit(1);
//     }
//     if (!(0 <= B[i] && B[i] <= N - 1)) {
//       fprintf(stderr, "error: B[%d] is out of bounds.\n", i);
//       exit(1);
//     }
//     if (A[i] == B[i]) {
//       fprintf(stderr, "error: B[%d] is equal to A[%d].\n", i, i);
//       exit(1);
//     }
//     if (1 != scanf("%d", &D[i])) {
//       fprintf(stderr, "error: cannot read D[%d].\n", i);
//       exit(1);
//     }
//     if (!(1 <= D[i] && D[i] <= MAX_VALUE)) {
//       fprintf(stderr, "error: D[%d] is out of bounds.\n", i);
//       exit(1);
//     }
//   }
// 
//   STop = 0;
//   TTop = 0;
// 
//   for (j = 0; j < Q; ++j) {
//     if (2 != scanf("%d%d", &S[j], &T[j])) {
//       fprintf(stderr, "error: cannot read L[%d] and R[%d].\n", j, j);
//       exit(1);
//     }
// 
//     if(STop + S[j] > MAX_SUM_ST) {
//       fprintf(stderr, "error: S[0] + S[1] + ... + S[%d] is out of bounds.\n", j);
//       exit(1);
//     }
// 
//     if(TTop + T[j] > MAX_SUM_ST) {
//       fprintf(stderr, "error: T[0] + T[1] + ... + T[%d] is out of bounds.\n", j);
//       exit(1);
//     }
// 
//     for (k = 0; k < S[j]; ++k, ++STop) {
//       if (1 != scanf("%d", &X[STop])) {
//         fprintf(stderr, "error: cannot read X[%d][%d].\n", j, k);
//         exit(1);
//       }
// 
//       if (!(0 <= X[STop] && X[STop] <= N - 1)) {
//         fprintf(stderr, "error: cannot read X[%d][%d].\n", j, k);
//         exit(1);
//       }
//     }
// 
//     for (k = 0; k < T[j]; ++k, ++TTop) {
//       if (1 != scanf("%d", &Y[TTop])) {
//         fprintf(stderr, "error: cannot read Y[%d][%d].\n", j, k);
//         exit(1);
//       }
// 
//       if (!(0 <= Y[TTop] && Y[TTop] <= N - 1)) {
//         fprintf(stderr, "error: cannot read Y[%d][%d].\n", j, k);
//         exit(1);
//       }
//     }
//   }
// 
//   STop = 0;
//   TTop = 0;
//   Init(N, A, B, D);
// 
//   for (j = 0; j < Q; ++j) {
//     for (k = 0; k < S[j]; k++) {
//         Qx[k] = X[STop++];
//     }
//     for (k = 0; k < T[j]; k++) {
//         Qy[k] = Y[TTop++];
//     }
// 
//     printf("%lld\n", Query(S[j], Qx, T[j], Qy));
//   }
// 
// 
//   return 0;
// }

Compilation message

factories.cpp: In function 'void bfs(int)':
factories.cpp:49:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |         for(int i=0;i<AA[u].size();i++){
      |                     ~^~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:113:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |             for(int i=0;i<AA[u].size();i++){
      |                         ~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 30036 KB Output is correct
2 Correct 351 ms 38488 KB Output is correct
3 Correct 353 ms 38676 KB Output is correct
4 Correct 650 ms 38608 KB Output is correct
5 Correct 326 ms 38500 KB Output is correct
6 Correct 451 ms 38668 KB Output is correct
7 Correct 326 ms 38452 KB Output is correct
8 Correct 567 ms 38504 KB Output is correct
9 Correct 329 ms 38464 KB Output is correct
10 Correct 462 ms 38664 KB Output is correct
11 Correct 313 ms 38500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 29772 KB Output is correct
2 Correct 1527 ms 114248 KB Output is correct
3 Correct 3964 ms 111508 KB Output is correct
4 Correct 1066 ms 116976 KB Output is correct
5 Correct 3748 ms 113200 KB Output is correct
6 Correct 2550 ms 113284 KB Output is correct
7 Correct 5709 ms 54200 KB Output is correct
8 Correct 1797 ms 56420 KB Output is correct
9 Correct 3733 ms 55500 KB Output is correct
10 Correct 3150 ms 55464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 30036 KB Output is correct
2 Correct 351 ms 38488 KB Output is correct
3 Correct 353 ms 38676 KB Output is correct
4 Correct 650 ms 38608 KB Output is correct
5 Correct 326 ms 38500 KB Output is correct
6 Correct 451 ms 38668 KB Output is correct
7 Correct 326 ms 38452 KB Output is correct
8 Correct 567 ms 38504 KB Output is correct
9 Correct 329 ms 38464 KB Output is correct
10 Correct 462 ms 38664 KB Output is correct
11 Correct 313 ms 38500 KB Output is correct
12 Correct 17 ms 29772 KB Output is correct
13 Correct 1527 ms 114248 KB Output is correct
14 Correct 3964 ms 111508 KB Output is correct
15 Correct 1066 ms 116976 KB Output is correct
16 Correct 3748 ms 113200 KB Output is correct
17 Correct 2550 ms 113284 KB Output is correct
18 Correct 5709 ms 54200 KB Output is correct
19 Correct 1797 ms 56420 KB Output is correct
20 Correct 3733 ms 55500 KB Output is correct
21 Correct 3150 ms 55464 KB Output is correct
22 Correct 1275 ms 122816 KB Output is correct
23 Correct 1969 ms 126392 KB Output is correct
24 Correct 1348 ms 121788 KB Output is correct
25 Correct 1567 ms 122848 KB Output is correct
26 Correct 1658 ms 118232 KB Output is correct
27 Correct 2091 ms 122392 KB Output is correct
28 Correct 1630 ms 138948 KB Output is correct
29 Correct 3541 ms 118240 KB Output is correct
30 Correct 4221 ms 118288 KB Output is correct
31 Correct 4904 ms 118376 KB Output is correct
32 Correct 750 ms 56936 KB Output is correct
33 Correct 575 ms 59124 KB Output is correct
34 Correct 500 ms 53980 KB Output is correct
35 Correct 563 ms 54104 KB Output is correct
36 Correct 574 ms 53760 KB Output is correct
37 Correct 598 ms 53820 KB Output is correct