Submission #221797

#TimeUsernameProblemLanguageResultExecution timeMemory
221797patrikpavic2Valley (BOI19_valley)C++17
100 / 100
387 ms68600 KiB
/**
* user:  ppavic
* fname: Patrik
* lname: Pavić
* task:  valley
* score: 100.0
* date:  2019-05-04 08:02:52.599602
*/
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

#define X first
#define Y second
#define PB push_back

using namespace std;

typedef long long ll;
typedef pair < int, ll > pil;

const int N = 1e5 + 500;
const int LOG = 18;
const ll INF = 0x3f3f3f3f;

int par[N][LOG], ind[N], dep[N], A[N], B[N];
ll dis[N][LOG], dp2[N][LOG], dp[N];
int n, E, m, q;

vector < pil > v[N];
vector < ll > dp3[N], dp3_r[N];

ll f(int x,int lst){
    par[x][0] = lst; dp2[x][0] = INF * INF; dep[x] = dep[lst] + 1;
    ll cur = INF * INF;int koj = 0;
    for(pil y : v[x]){
        dp3[x].PB(dp[x]);
        if(y.X == lst) continue;
        ind[y.X] = koj++;
        dis[y.X][0] = y.Y;
        f(y.X, x);
        dp[x] = min(dp[x], dp[y.X] + y.Y);
    }
    reverse(v[x].begin(), v[x].end());
    for(pil y : v[x]){
        dp3_r[x].PB(dp[x]);
        if(y.X == lst) continue;
        cur = min(cur, dp[y.X] + y.Y);
    }
    reverse(dp3_r[x].begin(), dp3_r[x].end());
}

void napravi_sve_bitno(){
    // jos treba postaviti dp2[i][0] na sam parenta -- jesam
    for(int i = 1;i <= n;i++){
        dp2[i][0] = dis[i][0] + min(dp3[par[i][0]][ind[i]], dp3_r[par[i][0]][ind[i]]);
    }
    for(int k = 1;k < LOG;k++){
        for(int i = 1;i <= n;i++){
            par[i][k] = par[par[i][k - 1]][k - 1];
            dis[i][k] = dis[i][k - 1] + dis[par[i][k - 1]][k - 1];
            dp2[i][k] = min(dp2[i][k - 1], dis[i][k - 1] + dp2[par[i][k - 1]][k - 1]);
            //dp2[i][k] = min(dp2[i][k], min(dp3[par[par[i][k - 1]][0]][ind[par[i][k - 1]]], dp3_r[par[par[i][k - 1]][0]][ind[par[i][k - 1]]])); -- mislim da ovo ne treba
        }
    }
}

bool nalazi(int x,int y){
    if(dep[y] > dep[x]) return 0;
    for(int i = LOG - 1;i >= 0;i--){
        if(dep[x] - (1 << i) >= dep[y])
            x = par[x][i];
    }
    return x == y;
}

ll nadi(int x,int y){
    ll ret = dp[x], cur_d = 0;
    //printf("NADI %d i %d DP %lld\n", x, y, dp[x]);
    for(int i = LOG - 1;i >= 0;i--){
        if(dep[x] - (1 << i) >= dep[y]){
            ret = min(ret, cur_d + dp2[x][i]);
            cur_d += dis[x][i];
            x = par[x][i];
        }
    }
    return ret;
}

int main(){
    scanf("%d%d%d%d", &n, &m, &q, &E);
    for(int i = 1;i < n;i++){
        int x, y, z; scanf("%d%d%d", &x, &y, &z);
        v[x].PB({y, z});
        v[y].PB({x, z});
        A[i] = x, B[i] = y;
        dp[i] = INF * INF;
    }
    dp[n] = INF * INF;
    for(int i = 0;i < m;i++){
        int x; scanf("%d", &x); dp[x] = 0;
    }
    f(E, E);
    //return 0;
    napravi_sve_bitno();

    for(int i = 0;i < q;i++){
        int x, y; scanf("%d%d", &x, &y);
        if(dep[A[x]] < dep[B[x]]) swap(A[x], B[x]);
        if(!nalazi(y, A[x]) || !nalazi(y, B[x])){
            printf("escaped\n"); continue;
        }
        ll ans = nadi(y, A[x]);
        if(ans >= INF * INF) printf("oo\n");
        else printf("%lld\n", ans);
    }
}

Compilation message (stderr)

valley.cpp: In function 'll f(int, int)':
valley.cpp:52:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
valley.cpp: In function 'int main()':
valley.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d", &n, &m, &q, &E);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.cpp:94:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int x, y, z; scanf("%d%d%d", &x, &y, &z);
                      ~~~~~^~~~~~~~~~~~~~~~~~~~~~
valley.cpp:102:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int x; scanf("%d", &x); dp[x] = 0;
                ~~~~~^~~~~~~~~~
valley.cpp:109:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         int x, y; scanf("%d%d", &x, &y);
                   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...