Submission #161076

# Submission time Handle Problem Language Result Execution time Memory
161076 2019-10-31T13:21:49 Z Akashi Mousetrap (CEOI17_mousetrap) C++14
25 / 100
1136 ms 81388 KB
#include <bits/stdc++.h>
using namespace std;

const int lim = 1e6 + 5;

int n, t, m;
int w[lim], h[lim], TT[lim];
vector <int> v[lim];

void dfs(int nod = t, int papa = 0){
    bool frunza = true;
    int Max = 0, Max2 = 0;

    for(auto it : v[nod]){
        if(papa == it) continue ;

        frunza = false;

        TT[it] = nod;
        w[it] = w[nod];
        h[it] = h[nod] + 1;
        if(nod != t) w[it] = w[it] + (v[nod].size() - 2);

        dfs(it, nod);

        if(w[it] > Max) Max2 = Max, Max = w[it];
        else if(w[it] > Max2) Max2 = w[it];
    }

    if(frunza) w[nod] = w[nod] + h[nod];
    else{
        if(Max2 == 0) w[nod] = w[nod] + h[nod] + 1;
        else w[nod] = Max2;
    }

}

inline bool check(int tmp){
    int cnt = 0;
    for(int nod = m, nr = 0, Last = 0; nod != t ; Last = nod, nod = TT[nod], ++nr){
        int aux = 0;
        for(auto it : v[nod]){
            if(it == TT[nod] || it == Last) continue ;

            if(w[it] - h[nod] - (nod != m) + cnt > tmp) ++aux;
        }

        cnt = cnt + aux;
        if(cnt > nr + 1) return 0;
    }

    if(cnt > tmp) return 0;

    return 1;
}

int main()
{
//    freopen("1.in", "r", stdin);

    scanf("%d%d%d", &n, &t, &m);

    int x, y;
    for(int i = 2; i <= n ; ++i){
        scanf("%d%d", &x, &y);
        v[x].push_back(y);
        v[y].push_back(x);
    }

    dfs();

    int st = 1, dr = 2 * n;
    while(st <= dr){
        int mij = (st + dr) / 2;

        if(check(mij)) dr = mij - 1;
        else st = mij + 1;
    }

    printf("%d", st);

    return 0;
}















Compilation message

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:61:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d", &n, &t, &m);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:65:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &x, &y);
         ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 25 ms 23800 KB Output is correct
2 Correct 27 ms 23800 KB Output is correct
3 Incorrect 27 ms 23800 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 450 ms 66912 KB Output is correct
2 Correct 413 ms 74680 KB Output is correct
3 Correct 1002 ms 81388 KB Output is correct
4 Correct 520 ms 52428 KB Output is correct
5 Correct 1136 ms 81344 KB Output is correct
6 Correct 1052 ms 81312 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 23800 KB Output is correct
2 Correct 27 ms 23800 KB Output is correct
3 Incorrect 27 ms 23800 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 23800 KB Output is correct
2 Correct 27 ms 23800 KB Output is correct
3 Incorrect 27 ms 23800 KB Output isn't correct
4 Halted 0 ms 0 KB -