답안 #256171

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
256171 2020-08-02T10:48:26 Z giorgikob Mousetrap (CEOI17_mousetrap) C++14
25 / 100
1854 ms 67064 KB
#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;

const int N = 1e6 + 5;

int n, m, t;
int w[N], P[N];
vector<int> gr[N];
vector<pair<int,int>> L;
vector<int> path;

void dfs(int x, int p){
        P[x] = p;
        for(auto to : gr[x]){
                if(to == p) continue;
                dfs(to, x);
        }
}

int cnt;

void count_w(int x, int cnt, int dep){

        if(gr[x].size() == 1){
                w[x] = cnt + dep;
                return ;
        }
        cnt += gr[x].size() - 2;
        vector<int>v;
        for(int to : gr[x]){
                if(to == P[x]) continue;
                count_w(to, cnt, dep+1);
                v.pb(w[to]);
        }
        sort(v.rbegin(),v.rend());
        if(v.size() == 1){
                w[x] = 1 + dep + cnt;
        } else {
                w[x] = v[1];
        }
}

inline bool check(int x){
        int B = 0;
        for(int i = 0; i < L.size(); i++){
                auto p = L[i];
                //if(i == L.size() - 1) return p.ss + B <= x;
                if(B >= p.ff){
                        if(p.ss + B > x) return false;
                } else
                if(p.ss + B > x){
                        B++;
                }
                if(B > x) return false;
        }

        return true;
}

int main(){

        cin >> n >> t >> m;

        for(int i = 1; i < n; i++){
                int x, y;
                cin >> x >> y;
                gr[x].pb(y);
                gr[y].pb(x);
        }

        dfs(t,0);

        int ver = m;
        while(ver != t){
                path.pb(ver);
                ver = P[ver];
        }

        reverse(path.begin(), path.end());

        for(int i = 0; i < path.size(); i++){
                int x = path[i];
                int k = 3;
                if(i == path.size() - 1) k--;
                cnt += max(0, (int)gr[x].size() - k);
                for(int to : gr[x]){
                        if(to == P[x]) continue;
                        if(path.size() - 1 != i && to == path[i+1]) continue;
                        count_w(to, cnt, 1);
                        L.pb({path.size() - i, w[to]});
                }
                cnt++;
        }


        //for(int i = 1; i <= n; i++) cout << w[i] << " "; cout << endl;

        sort(L.begin(), L.end());

        //for(auto p : L) cout << p.ff << " " << p.ss << endl;

        int l = 0, r = 1e6, answer = -1;
        while(l <= r) {
                int mid = l+r; mid >>= 1;
                if(check(mid)){
                        answer = mid;
                        r = mid - 1;
                } else {
                        l = mid + 1;
                }
        }

        cout << answer << endl;

}

Compilation message

mousetrap.cpp: In function 'bool check(int)':
mousetrap.cpp:49:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0; i < L.size(); i++){
                        ~~^~~~~~~~~~
mousetrap.cpp: In function 'int main()':
mousetrap.cpp:85:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int i = 0; i < path.size(); i++){
                        ~~^~~~~~~~~~~~~
mousetrap.cpp:88:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(i == path.size() - 1) k--;
                    ~~^~~~~~~~~~~~~~~~~~
mousetrap.cpp:92:44: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                         if(path.size() - 1 != i && to == path[i+1]) continue;
                            ~~~~~~~~~~~~~~~~^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 23808 KB Output is correct
2 Correct 18 ms 23808 KB Output is correct
3 Correct 15 ms 23808 KB Output is correct
4 Correct 15 ms 23808 KB Output is correct
5 Correct 15 ms 23808 KB Output is correct
6 Correct 14 ms 23808 KB Output is correct
7 Incorrect 15 ms 23808 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1245 ms 65860 KB Output is correct
2 Correct 1064 ms 61944 KB Output is correct
3 Correct 1822 ms 67024 KB Output is correct
4 Correct 958 ms 47352 KB Output is correct
5 Correct 1854 ms 67064 KB Output is correct
6 Correct 1772 ms 66912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 23808 KB Output is correct
2 Correct 18 ms 23808 KB Output is correct
3 Correct 15 ms 23808 KB Output is correct
4 Correct 15 ms 23808 KB Output is correct
5 Correct 15 ms 23808 KB Output is correct
6 Correct 14 ms 23808 KB Output is correct
7 Incorrect 15 ms 23808 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 23808 KB Output is correct
2 Correct 18 ms 23808 KB Output is correct
3 Correct 15 ms 23808 KB Output is correct
4 Correct 15 ms 23808 KB Output is correct
5 Correct 15 ms 23808 KB Output is correct
6 Correct 14 ms 23808 KB Output is correct
7 Incorrect 15 ms 23808 KB Output isn't correct
8 Halted 0 ms 0 KB -