Submission #1153710

#TimeUsernameProblemLanguageResultExecution timeMemory
1153710OtalpAmusement Park (JOI17_amusement_park)C++20
100 / 100
28 ms12360 KiB
#include "Joi.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second

namespace{
    int pos[200100];
    int a[200100], cnt[200100];
    vector<int> dq[200100], q[200100];
    const int MAXK = 60;

    void dfs0(int v){
        pos[v] = 1;
        for(int to: dq[v]){
            if(pos[to]) continue;
            q[v].pb(to);
            q[to].pb(v);
            dfs0(to);
        }    
    }


    // pii dfs1(int v, int p){
    //     pii h={1, v};
    //     for(int to: q[v]){
    //         if(p == to) continue;
    //         pii g=dfs1(to, v);
    //         h = max(h, {g.ff + 1, g.ss});
    //     }
    //     return h;
    // }

    set<pii> h;
    int K = 0;
    int P[200100];

    void dfs1(int v, int p){
        if(K < MAXK){
            a[v] = K ++;
            // if(h.find({a[p], p}) != h.end() and (p != 0 or (p == 0 and cnt[0] > 1))) h.erase(h.find({a[p], p}));
            // h.insert({a[v], v});
            if(p != -1) cnt[v] = 1;
            if(p != -1) cnt[p] ++;
        }
        P[v] = p;
        for(int to: q[v]){
            if(p == to) continue;
            dfs1(to, v);
        }
    }

    void dfs2(int v, int p){
        pii g={-1, -1};
        // cout<<v<<'\n';
        if(a[v] == -1){
            auto it = h.begin();
            if(it -> ss == p){
                it++;
            }
            g = *it;
            h.erase(it);
            a[v] = g.ff;
            cnt[v] = 1;
            cnt[p] ++;
            cnt[g.ss] = 0;
            h.insert({a[v], v});
            if(cnt[p] == 2 and h.find({a[p], p}) != h.end()) h.erase(h.find({a[p], p}));
            cnt[P[g.ss]]--;
            if(cnt[P[g.ss]] == 1) h.insert({a[P[g.ss]], P[g.ss]});
        }
        // cout<<"ok\n";
        int dp = -1;
        for(int to: q[v]){
            if(to == p) continue;
            // dp = P[v];
            P[v] = to;
            dfs2(to, v);
        }
        P[v] = p;
        if(g.ff != -1){
            cnt[v] = 0;
            cnt[p] --;
            cnt[P[g.ss]] ++;
            cnt[g.ss] = 1;
            // for(pii x:h) cout<<x.ff<<' '<<x.ss<<'\n';
            h.erase(h.find({a[v], v}));
            // cout<<"ok";
            // cout<<"suka\n";
            if(cnt[p] == 1) h.insert({a[p], p});
            if(cnt[P[g.ss]] == 2 and h.find({a[P[g.ss]], P[g.ss]}) != h.end()) h.erase(h.find({a[P[g.ss]], P[g.ss]}));
            h.insert(g);
        }
        // cout<<"ok"<<' '<<v<<'\n';
        // cout<<"suka\n";
        
    }
}


void Joi(int n, int m, int A[], int B[], long long X, int T){
    for(int i=0; i<n; i++) a[i] = -1;
    for(int i=0; i<m; i++){
        int l = A[i], r = B[i];
        dq[l].pb(r);
        dq[r].pb(l);
    }
    dfs0(0);
    // int f = (dfs1(0, -1)).ss;
    // pii g = (dfs1(f, -1));
    // int s = g.ss;
    // if(g.ff < 60){
    dfs1(0, -1);
    for(int i=0; i<n; i++){
        // cout<<i<<' '<<cnt[i]<<'\n';
        if(a[i] != -1 and cnt[i] == 1) h.insert({a[i], i});
    }
    dfs2(0, -1);  
    for(int i=0; i<n; i++){
        // cout<<a[i]<<' ';
        MessageBoard(i, bool(X & (1ll << a[i])));
    }  
    // for(int i=0; i<60; i++){
    //     MessageBoard(i, bool(X & (1ll << i)));
    // } 
    // for(int i=60; i<n; i++){
    //     MessageBoard(i, 0);
    // }
}
#include "Ioi.h"
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int, int>
#define ff first
#define ss second



namespace{
    int pos[200100];
    int a[200100], cnt[200100];
    vector<int> dq[200100], q[200100];
    const int MAXK = 60;

    void dfs0(int v){
        pos[v] = 1;
        for(int to: dq[v]){
            if(pos[to]) continue;
            q[v].pb(to);
            q[to].pb(v);
            dfs0(to);
        }    
    }


    // pii dfs1(int v, int p){
    //     pii h={1, v};
    //     for(int to: q[v]){
    //         if(p == to) continue;
    //         pii g=dfs1(to, v);
    //         h = max(h, {g.ff + 1, g.ss});
    //     }
    //     return h;
    // }

    set<pii> h;
    int K = 0;
    int P[200100];

    void dfs1(int v, int p){
        if(K < MAXK){
            a[v] = K ++;
            // if(h.find({a[p], p}) != h.end() and (p != 0 or (p == 0 and cnt[0] > 1))) h.erase(h.find({a[p], p}));
            // h.insert({a[v], v});
            if(p != -1) cnt[v] = 1;
            if(p != -1) cnt[p] ++;
        }
        P[v] = p;
        for(int to: q[v]){
            if(p == to) continue;
            dfs1(to, v);
        }
    }

    
    void dfs2(int v, int p){
        pii g={-1, -1};
        // cout<<v<<'\n';
        if(a[v] == -1){
            auto it = h.begin();
            if(it -> ss == p){
                it++;
            }
            g = *it;
            h.erase(it);
            a[v] = g.ff;
            cnt[v] = 1;
            cnt[p] ++;
            cnt[g.ss] = 0;
            h.insert({a[v], v});
            if(cnt[p] == 2 and h.find({a[p], p}) != h.end()) h.erase(h.find({a[p], p}));
            cnt[P[g.ss]]--;
            if(cnt[P[g.ss]] == 1) h.insert({a[P[g.ss]], P[g.ss]});
        }
        // cout<<"ok\n";
        int dp = -1;
        for(int to: q[v]){
            if(to == p) continue;
            // dp = P[v];
            P[v] = to;
            dfs2(to, v);
        }
        P[v] = p;
        if(g.ff != -1){
            cnt[v] = 0;
            cnt[p] --;
            cnt[P[g.ss]] ++;
            cnt[g.ss] = 1;
            // for(pii x:h) cout<<x.ff<<' '<<x.ss<<'\n';
            h.erase(h.find({a[v], v}));
            // cout<<"ok";
            // cout<<"suka\n";
            if(cnt[p] == 1) h.insert({a[p], p});
            if(cnt[P[g.ss]] == 2 and h.find({a[P[g.ss]], P[g.ss]}) != h.end()) h.erase(h.find({a[P[g.ss]], P[g.ss]}));
            h.insert(g);
        }
        // cout<<"ok"<<' '<<v<<'\n';
        // cout<<"suka\n";
        
    }
}

ll X;
int us[100];

void dfs4(int v, int p, int k){
    X += (1ll << a[v]) * k;
    us[a[v]] = 1;
    for(int to: q[v]){
        if(p == to) continue;
        if(us[a[to]] == 1) continue;
        dfs4(to, v, Move(to));
        Move(v);
    }
}

long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) {
    for(int i=0; i<n; i++) a[i] = -1;
    for(int i=0; i<m; i++){
        int l = A[i], r = B[i];
        dq[l].pb(r);
        dq[r].pb(l);
    }
    dfs0(0);
    for(int i=0; i<60; i++) us[i] = 0;
    // int f = (dfs1(0, -1)).ss;
    // pii g = (dfs1(f, -1));
    // int s = g.ss;
    // if(g.ff < 60){
    dfs1(0, -1);
    for(int i=0; i<n; i++){
        if(a[i] != -1 and cnt[i] == 1) h.insert({a[i], i});
    }
    dfs2(0, -1);  
    X = 0;
    dfs4(P, -1, V);
    return X;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...