답안 #1053463

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1053463 2024-08-11T12:12:30 Z steveonalex Mousetrap (CEOI17_mousetrap) C++17
100 / 100
457 ms 207540 KB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()
#define block_of_code if(true)
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll gcd(ll a, ll b){return __gcd(a, b);}
ll lcm(ll a, ll b){return a / gcd(a, b) * b;}
 
ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ll mask){return __builtin_popcountll(mask);}
int ctz(ull mask){return __builtin_ctzll(mask);}
int logOf(ull mask){return 63 - __builtin_clzll(mask);}
 
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}
 
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b) {a = b; return true;}
        return false;
    }
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b) {a = b; return true;}
        return false;
    }
 
template <class T>
    void printArr(T container, string separator = " ", string finish = "\n", ostream &out = cout){
        for(auto item: container) out << item << separator;
        out << finish;
    }
 
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }

const int N = 1e6 + 69;
int n, s, t;
vector<int> graph[N], val[N];
int dp[N];
int parent[N];

bool find_t(int u, int p){
    parent[u] = p;
    if (u == t) return true;
    bool check = false;
    for(int v: graph[u]) if (v != p) 
        check = check || find_t(v, u);
    return check;
}

void dfs(int u, int p){
    int child_cnt = 0;
    for(int v: graph[u]) if (v != p) {
        dfs(v, u);
        child_cnt++;
    }
    if (child_cnt <= 1){
        dp[u] = child_cnt;
        return;
    }
    vector<int> toxic;
    for(int v: graph[u]) if (v != p) toxic.push_back(dp[v]);
    sort(ALL(toxic), greater<int>());
    dp[u] = toxic[1] + toxic.size();
}

int main(void){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
 
    clock_t start = clock();

    cin >> n >> s >> t;
    if (s == t){
        cout << 0 << "\n";
        return 0;
    }
    for(int i = 1; i<n; ++i){
        int u, v; cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }

    int branch = -1;
    for(int v: graph[s]){
        if (find_t(v, s)) branch = v;
    }
    graph[s] = {branch};

    int u = t;

    vector<int> chain;

    while(u != s){
        dfs(u, parent[u]);
        for(int v: graph[u]) if (v != parent[u]) val[u].push_back(dp[v]);
        sort(ALL(val[u]), greater<int>());

        auto it = find(ALL(graph[parent[u]]), u);
        graph[parent[u]].erase(it);

        chain.push_back(u);

        u = parent[u];
    }

    int sum = 0;
    for(int i: chain){
        sum += val[i].size();
    }

    int l = 0, r = n * 2;
    while(l < r){
        int mid = (l + r) >> 1;

        // cout << "Mid: " << mid << "\n";

        int _s = sum;
        vector<int> b;

        for(int i = 0; i < chain.size(); ++i){
            int u = chain[i];
            for(int v: val[u]) {
                if (v + _s + b.size() > mid)
                    b.push_back(i);
                _s--;
            }
        }

        bool legit = true;
        if (b.size() > min(chain.size(), mid)) legit = false;
        if (legit){
            for(int i = 0; i < b.size(); ++i) if (b[i] < i) legit = false;
        }
        if (legit) r = mid;
        else l = mid + 1;
    }

    cout << l << "\n";





    cerr << "Time elapsed: " << clock() - start << " ms!\n";
    return 0;
}

Compilation message

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:134:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  134 |         for(int i = 0; i < chain.size(); ++i){
      |                        ~~^~~~~~~~~~~~~~
mousetrap.cpp:137:39: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  137 |                 if (v + _s + b.size() > mid)
      |                     ~~~~~~~~~~~~~~~~~~^~~~~
mousetrap.cpp:144:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
  144 |         if (b.size() > min(chain.size(), mid)) legit = false;
      |             ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:146:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  146 |             for(int i = 0; i < b.size(); ++i) if (b[i] < i) legit = false;
      |                            ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 50780 KB Output is correct
2 Correct 7 ms 50780 KB Output is correct
3 Correct 7 ms 50780 KB Output is correct
4 Correct 7 ms 50972 KB Output is correct
5 Correct 7 ms 50780 KB Output is correct
6 Correct 7 ms 50780 KB Output is correct
7 Correct 7 ms 50920 KB Output is correct
8 Correct 7 ms 50780 KB Output is correct
9 Correct 7 ms 50780 KB Output is correct
10 Correct 7 ms 50776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 175 ms 84080 KB Output is correct
2 Correct 143 ms 81100 KB Output is correct
3 Correct 375 ms 85336 KB Output is correct
4 Correct 151 ms 69200 KB Output is correct
5 Correct 373 ms 85328 KB Output is correct
6 Correct 375 ms 85332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 50780 KB Output is correct
2 Correct 7 ms 50780 KB Output is correct
3 Correct 7 ms 50780 KB Output is correct
4 Correct 7 ms 50972 KB Output is correct
5 Correct 7 ms 50780 KB Output is correct
6 Correct 7 ms 50780 KB Output is correct
7 Correct 7 ms 50920 KB Output is correct
8 Correct 7 ms 50780 KB Output is correct
9 Correct 7 ms 50780 KB Output is correct
10 Correct 7 ms 50776 KB Output is correct
11 Correct 7 ms 50780 KB Output is correct
12 Correct 7 ms 50908 KB Output is correct
13 Correct 7 ms 50780 KB Output is correct
14 Correct 7 ms 50992 KB Output is correct
15 Correct 7 ms 51036 KB Output is correct
16 Correct 7 ms 50988 KB Output is correct
17 Correct 7 ms 50780 KB Output is correct
18 Correct 7 ms 50868 KB Output is correct
19 Correct 7 ms 51036 KB Output is correct
20 Correct 7 ms 51036 KB Output is correct
21 Correct 7 ms 50780 KB Output is correct
22 Correct 7 ms 50780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 50780 KB Output is correct
2 Correct 7 ms 50780 KB Output is correct
3 Correct 7 ms 50780 KB Output is correct
4 Correct 7 ms 50972 KB Output is correct
5 Correct 7 ms 50780 KB Output is correct
6 Correct 7 ms 50780 KB Output is correct
7 Correct 7 ms 50920 KB Output is correct
8 Correct 7 ms 50780 KB Output is correct
9 Correct 7 ms 50780 KB Output is correct
10 Correct 7 ms 50776 KB Output is correct
11 Correct 175 ms 84080 KB Output is correct
12 Correct 143 ms 81100 KB Output is correct
13 Correct 375 ms 85336 KB Output is correct
14 Correct 151 ms 69200 KB Output is correct
15 Correct 373 ms 85328 KB Output is correct
16 Correct 375 ms 85332 KB Output is correct
17 Correct 7 ms 50780 KB Output is correct
18 Correct 7 ms 50908 KB Output is correct
19 Correct 7 ms 50780 KB Output is correct
20 Correct 7 ms 50992 KB Output is correct
21 Correct 7 ms 51036 KB Output is correct
22 Correct 7 ms 50988 KB Output is correct
23 Correct 7 ms 50780 KB Output is correct
24 Correct 7 ms 50868 KB Output is correct
25 Correct 7 ms 51036 KB Output is correct
26 Correct 7 ms 51036 KB Output is correct
27 Correct 7 ms 50780 KB Output is correct
28 Correct 7 ms 50780 KB Output is correct
29 Correct 7 ms 50780 KB Output is correct
30 Correct 162 ms 99668 KB Output is correct
31 Correct 181 ms 99668 KB Output is correct
32 Correct 211 ms 151492 KB Output is correct
33 Correct 212 ms 207540 KB Output is correct
34 Correct 457 ms 100688 KB Output is correct
35 Correct 414 ms 100692 KB Output is correct
36 Correct 440 ms 110696 KB Output is correct
37 Correct 414 ms 110632 KB Output is correct
38 Correct 308 ms 111552 KB Output is correct
39 Correct 308 ms 111556 KB Output is correct
40 Correct 318 ms 111552 KB Output is correct