제출 #493483

#제출 시각아이디문제언어결과실행 시간메모리
493483SangTinBall Machine (BOI13_ballmachine)C++14
100 / 100
175 ms29252 KiB
#include <bits/stdc++.h>

using namespace std;

#define name "BALLMACHINE"
#define endl '\n'
#define ednl endl
#define long long long
#define memset(a, x) memset(a, (x), sizeof(a));
#define inoutf freopen(name".inp", "r", stdin); freopen(name".out", "w", stdout);
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define IN(a, b, c) (a <= b && b <= c)

template<typename T, typename U> inline bool amin(T &x, U y) { if(y >= x) return 0; x = y; return 1;}
template<typename T, typename U> inline bool amax(T &x, U y) { if(x >= y) return 0; x = y; return 1;}
template<typename T> inline void read(T& x){
    bool Neg = false;
    char c;
    for (c = getchar(); c < '0' | c > '9'; c = getchar())
        if (c == '-') Neg = !Neg;
    x = c - '0';
    for (c = getchar(); c >= '0' && c <= '9'; c = getchar())
        x = x * 10 + c - '0';
    if (Neg) x = -x;
}

const int N = 1e5 + 83;
vector <int> Graph[N];
int Min[N], Priority[N], cnt = 0, pa[N][30], h[N], rePriority[N];
bool Have[N];

bool comp(int a, int b){
    return Min[a] < Min[b];
}

int dfs(bool sta, int u, int pa){
    if (sta && pa != -1) h[u] = h[pa] + 1;
    Min[u] = u;
    for (int &v : Graph[u]){
        amin(Min[u], dfs(sta, v, u));
    }
    if (sta){
        Priority[++cnt] = u;
        rePriority[u] = cnt;
    }
    return Min[u];
}

struct segtree{
    int Size;
    vector <int> ord;

    void init(int n){
        Size = n;
        ord.assign(4 * n, 0);
    }

    void update(int &i, int &p, int x, int lx, int rx){
        if (lx == rx){
            ord[x] = p;
            return;
        }
        int mid = (lx + rx) >> 1;
        if (mid < i) update(i, p, x << 1 | 1, mid + 1, rx);
        else update(i, p, x << 1, lx, mid);
        ord[x] = ord[x << 1] + ord[x << 1 | 1];
    }
    void update(int i, int p){update(i, p, 1, 1, Size);}

    int get_prio(int k, int x, int lx, int rx){
        if (lx == rx) return Priority[lx];
        int mid = (lx + rx) >> 1;
        if (ord[x << 1] < k) return get_prio(k - ord[x << 1], x << 1 | 1, mid + 1, rx);
        return get_prio(k, x << 1, lx, mid);
    }
    int get_prio(int k){return get_prio(k, 1, 1, Size);}
}st;

int LCA(int u){
    int log = log2(h[u]);
    for (int i = log; i >= 0; --i){
        if (pa[u][i] != -1 && Have[pa[u][i]]) u = pa[u][i];
    }
    return u;
}

int Solve(){
    int n, q; cin >> n >> q;
    memset(pa, -1);
    for (int i = 1; i <= n; ++i){
        cin >> pa[i][0];
        Graph[pa[i][0]].push_back(i);
    }
    dfs(0, 0, -1);
    for (int i = 1; i <= n; ++i){
        sort(Graph[i].begin(), Graph[i].end(), comp);
    }
    h[0] = 0;
    dfs(1, 0, -1);

    memset(Have, 0);
    st.init(n);
    for (int i = 1; i <= n; ++i) st.update(i, 1);

    int log = log2(n);
    for (int j = 1; j <= log; ++j){
        for (int i = 1; i <= n; ++i){
            if (pa[i][j - 1] == -1) continue;
            pa[i][j] = pa[pa[i][j - 1]][j - 1];
        }
    }

    while (q--){
        int sta, x; cin >> sta >> x;
        switch (sta){
            case 1:{
                int last;
                while(x--){
                    last = st.get_prio(1);
                    Have[last] = 1;
                    st.update(rePriority[last], 0);
                }
                cout << last << endl;
                break;
            }
            case 2:{
                int farPa = LCA(x);
                cout << h[x] - h[farPa] << endl;
                st.update(rePriority[farPa], 1);
                Have[farPa] = 0;
                break;
            }
        }
    }

    return 0;
}

int main(){
    fastio;

    int t = 1;
//    cin >> t;
    while (t--){
        Solve();
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

ballmachine.cpp: In function 'int Solve()':
ballmachine.cpp:6:14: warning: 'last' may be used uninitialized in this function [-Wmaybe-uninitialized]
    6 | #define endl '\n'
      |              ^~~~
ballmachine.cpp:117:21: note: 'last' was declared here
  117 |                 int last;
      |                     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...