Submission #320510

# Submission time Handle Problem Language Result Execution time Memory
320510 2020-11-09T01:26:31 Z ant101 Ball Machine (BOI13_ballmachine) C++14
97.1429 / 100
1000 ms 32868 KB
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <fstream>
#include <cmath>
#include <vector>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <stack>
#include <queue>
#include <assert.h>
#include <limits>
#include <cstdio>
#include <complex>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define debug(x) cerr << #x << ": " << x << endl
#define debug2(x, y) debug(x), debug(y)
#define repn(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define rep(i, a) for(int i = 0; i < (int)(a); i++)
#define all(v) v.begin(), v.end()
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define sq(x) ((x) * (x))
#define inf 0x3f3f3f3f
const int mxN = 1e5 + 5;

template<class T> T gcd(T a, T b){ return ((b == 0) ? a : gcd(b, a % b)); }

int n, le;
int ind[mxN], mn[mxN], vis[mxN];
int st[mxN], fin[mxN], dep[mxN];
int num = 0, rt = -1;
vi g[mxN];
vector<vi> up;

void dfs0(int cur, int prev, int d = 0){
    mn[cur] = cur;
    dep[cur] = d;
    for(int x : g[cur]) if(x != prev){
        dfs0(x, cur, d + 1);
        mn[cur] = min(mn[cur], mn[x]);
    }
}

bool cmp(int a, int b){
    return mn[a] < mn[b];
}

vi ord;

void dfs(int cur, int prev = rt){
    st[cur] = num++;
    up[cur][0] = prev;
    repn(i, 1, le + 1) up[cur][i] = up[up[cur][i - 1]][i - 1];
    for(int x : g[cur]) if(x != prev) dfs(x, cur);
    ord.pb(cur);
    fin[cur] = num++;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    //freopen("input.in", "r", stdin);
    //freopen("output.out", "w", stdout);
    int n, q;
    cin >> n >> q;
    memset(mn, inf, sizeof(mn));
    rep(i, n){
        int a;
        cin >> a;
        a--;
        if(a >= 0){
            g[i].pb(a);
            g[a].pb(i);
        }
        else rt = i;
    }
    dfs0(rt, -1); //get the minimums
    rep(i, n) sort(all(g[i]), cmp);
    up.resize(n);
    le = 1;
    while((1 << le) <= n) le++;
    rep(i, n) up[i].resize(le + 1);
    dfs(rt);
    rep(i, n) ind[ord[i]] = i;
    set<pi> st;
    rep(i, n) st.insert({ind[i], i}); //we sort by the index from the toposort
    rep(i, q){
        int t;
        cin >> t;
        if(t == 1){
            int k;
            cin >> k;
            int lst = -1;
            rep(j, k){
                pi cur = *st.begin();
                st.erase(st.begin());
                vis[cur.se] = 1;
                lst = cur.se;
            }
            cout << lst + 1 << '\n';
        }
        else{
            //we use binary search + binary lifting
            //to find the first unvisited node above the deleted one
            int x;
            cin >> x;
            x--;
            if(x == rt || !vis[up[x][0]]){
                cout << 0 << '\n';
                vis[x] = 0;
                st.insert({ind[x], x});
                continue;
            }
            int l = 1, r = dep[x];
            while(l < r){
                int mid = (l + r) / 2;
                int nd = x;
                rep(j, le) if(mid & (1 << j)) nd = up[nd][j];
                if(!vis[nd]) r = mid;
                else l = mid + 1;
            }
            int cur = l;
            int nd = x;
            rep(j, le) if(cur & (1 << j)) nd = up[nd][j];
            if(!vis[nd]){
                cur--;
                nd = x;
                l--;
                rep(j, le) if(cur & (1 << j)) nd = up[nd][j];
            }
            vis[nd] = 0;
            st.insert({ind[nd], nd});
            cout << l << '\n';
        }
    }
    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 3 ms 3180 KB Output is correct
2 Correct 229 ms 17912 KB Output is correct
3 Correct 117 ms 17632 KB Output is correct
4 Correct 2 ms 3052 KB Output is correct
5 Correct 3 ms 3180 KB Output is correct
6 Correct 3 ms 3308 KB Output is correct
7 Correct 4 ms 3308 KB Output is correct
8 Correct 4 ms 3308 KB Output is correct
9 Correct 10 ms 3948 KB Output is correct
10 Correct 32 ms 6756 KB Output is correct
11 Correct 210 ms 17780 KB Output is correct
12 Correct 120 ms 17504 KB Output is correct
13 Correct 178 ms 17888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 47 ms 9060 KB Output is correct
2 Correct 319 ms 28896 KB Output is correct
3 Correct 140 ms 24416 KB Output is correct
4 Correct 98 ms 11512 KB Output is correct
5 Correct 85 ms 11240 KB Output is correct
6 Correct 80 ms 11336 KB Output is correct
7 Correct 88 ms 10212 KB Output is correct
8 Correct 43 ms 9060 KB Output is correct
9 Correct 246 ms 29020 KB Output is correct
10 Correct 355 ms 29020 KB Output is correct
11 Correct 269 ms 29160 KB Output is correct
12 Correct 299 ms 26592 KB Output is correct
13 Correct 223 ms 29152 KB Output is correct
14 Correct 141 ms 24412 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 239 ms 16228 KB Output is correct
2 Correct 796 ms 27232 KB Output is correct
3 Correct 649 ms 26948 KB Output is correct
4 Correct 442 ms 23900 KB Output is correct
5 Correct 417 ms 23772 KB Output is correct
6 Correct 408 ms 23772 KB Output is correct
7 Correct 400 ms 22364 KB Output is correct
8 Correct 760 ms 27100 KB Output is correct
9 Correct 806 ms 29368 KB Output is correct
10 Correct 869 ms 29400 KB Output is correct
11 Correct 852 ms 29204 KB Output is correct
12 Correct 757 ms 27236 KB Output is correct
13 Execution timed out 1052 ms 32868 KB Time limit exceeded
14 Correct 245 ms 25180 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 902 ms 29276 KB Output is correct
2 Correct 686 ms 27104 KB Output is correct
3 Correct 239 ms 32516 KB Output is correct
4 Correct 926 ms 29276 KB Output is correct
5 Correct 742 ms 29124 KB Output is correct
6 Correct 487 ms 29176 KB Output is correct
7 Correct 740 ms 27200 KB Output is correct
8 Correct 258 ms 32612 KB Output is correct
9 Correct 175 ms 24412 KB Output is correct