답안 #1053446

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1053446 2024-08-11T11:58:58 Z steveonalex Mousetrap (CEOI17_mousetrap) C++17
100 / 100
486 ms 207240 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){
    for(int v: graph[u]) if (v != p) dfs(v, u);
    if (graph[u].size() <= 1) 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:127:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |         for(int i = 0; i < chain.size(); ++i){
      |                        ~~^~~~~~~~~~~~~~
mousetrap.cpp:130:39: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  130 |                 if (v + _s + b.size() > mid)
      |                     ~~~~~~~~~~~~~~~~~~^~~~~
mousetrap.cpp:137: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]
  137 |         if (b.size() > min(chain.size(), mid)) legit = false;
      |             ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:139:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |             for(int i = 0; i < b.size(); ++i) if (b[i] < i) legit = false;
      |                            ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 48728 KB Output is correct
2 Correct 7 ms 48732 KB Output is correct
3 Correct 9 ms 48732 KB Output is correct
4 Correct 6 ms 48732 KB Output is correct
5 Correct 7 ms 48732 KB Output is correct
6 Correct 6 ms 48732 KB Output is correct
7 Correct 8 ms 48732 KB Output is correct
8 Correct 7 ms 48732 KB Output is correct
9 Correct 7 ms 48732 KB Output is correct
10 Correct 6 ms 48732 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 158 ms 83796 KB Output is correct
2 Correct 143 ms 80468 KB Output is correct
3 Correct 416 ms 85332 KB Output is correct
4 Correct 146 ms 68560 KB Output is correct
5 Correct 395 ms 85240 KB Output is correct
6 Correct 384 ms 85392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 48728 KB Output is correct
2 Correct 7 ms 48732 KB Output is correct
3 Correct 9 ms 48732 KB Output is correct
4 Correct 6 ms 48732 KB Output is correct
5 Correct 7 ms 48732 KB Output is correct
6 Correct 6 ms 48732 KB Output is correct
7 Correct 8 ms 48732 KB Output is correct
8 Correct 7 ms 48732 KB Output is correct
9 Correct 7 ms 48732 KB Output is correct
10 Correct 6 ms 48732 KB Output is correct
11 Correct 8 ms 48728 KB Output is correct
12 Correct 7 ms 48988 KB Output is correct
13 Correct 7 ms 48732 KB Output is correct
14 Correct 9 ms 48988 KB Output is correct
15 Correct 7 ms 48988 KB Output is correct
16 Correct 8 ms 48988 KB Output is correct
17 Correct 8 ms 48900 KB Output is correct
18 Correct 7 ms 48988 KB Output is correct
19 Correct 7 ms 48988 KB Output is correct
20 Correct 7 ms 48844 KB Output is correct
21 Correct 7 ms 48984 KB Output is correct
22 Correct 7 ms 48856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 48728 KB Output is correct
2 Correct 7 ms 48732 KB Output is correct
3 Correct 9 ms 48732 KB Output is correct
4 Correct 6 ms 48732 KB Output is correct
5 Correct 7 ms 48732 KB Output is correct
6 Correct 6 ms 48732 KB Output is correct
7 Correct 8 ms 48732 KB Output is correct
8 Correct 7 ms 48732 KB Output is correct
9 Correct 7 ms 48732 KB Output is correct
10 Correct 6 ms 48732 KB Output is correct
11 Correct 158 ms 83796 KB Output is correct
12 Correct 143 ms 80468 KB Output is correct
13 Correct 416 ms 85332 KB Output is correct
14 Correct 146 ms 68560 KB Output is correct
15 Correct 395 ms 85240 KB Output is correct
16 Correct 384 ms 85392 KB Output is correct
17 Correct 8 ms 48728 KB Output is correct
18 Correct 7 ms 48988 KB Output is correct
19 Correct 7 ms 48732 KB Output is correct
20 Correct 9 ms 48988 KB Output is correct
21 Correct 7 ms 48988 KB Output is correct
22 Correct 8 ms 48988 KB Output is correct
23 Correct 8 ms 48900 KB Output is correct
24 Correct 7 ms 48988 KB Output is correct
25 Correct 7 ms 48988 KB Output is correct
26 Correct 7 ms 48844 KB Output is correct
27 Correct 7 ms 48984 KB Output is correct
28 Correct 7 ms 48856 KB Output is correct
29 Correct 7 ms 48928 KB Output is correct
30 Correct 175 ms 99728 KB Output is correct
31 Correct 163 ms 99924 KB Output is correct
32 Correct 215 ms 150320 KB Output is correct
33 Correct 221 ms 207240 KB Output is correct
34 Correct 486 ms 100864 KB Output is correct
35 Correct 464 ms 100692 KB Output is correct
36 Correct 429 ms 110708 KB Output is correct
37 Correct 437 ms 110772 KB Output is correct
38 Correct 307 ms 109960 KB Output is correct
39 Correct 326 ms 109900 KB Output is correct
40 Correct 308 ms 109868 KB Output is correct