Submission #800777

# Submission time Handle Problem Language Result Execution time Memory
800777 2023-08-01T20:38:22 Z nnhzzz Ball Machine (BOI13_ballmachine) C++14
100 / 100
156 ms 35620 KB
// cre: Nguyen Ngoc Hung - Train VOI 2024 :>

#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <unordered_set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <cstring>
#include <unordered_map>
#include <cmath>
#include <array>
#include <cassert>
#include <random>

using namespace std;

#define    SORT_UNIQUE(v)  sort(ALL(v)),(v).resize(unique(ALL(v))-(v).begin())
#define        __nnhzzz__  signed main()
#define          BIT(i,j)  ((i>>j)&1LL)
#define           MASK(i)  (1LL<<i)
#define           RALL(x)  (x).rbegin(),(x).rend()
#define            ALL(x)  (x).begin(),(x).end()
#define             SZ(x)  (int)(x).size()
#define                fi  first
#define                se  second
#define               INF  0x3f3f3f3f
#define                ll  long long
#define               ull  unsigned long long
#define                ld  long double
#define                vi  vector<int>
#define               vvi  vector<vi>
#define              vvvi  vector<vvi>
#define             vvvvi  vector<vvvi>
#define               pii  pair<int,int>
#define              vpii  vector<pii>
#define      RESET(x,val)  memset((x),(val),sizeof(x))
#define REPDIS(i,be,en,j)  for(int i = (be); i<=(en); i+=j)
#define     REPD(i,be,en)  for(int i = (be); i>=(en); i--)
#define      REP(i,be,en)  for(int i = (be); i<=(en); i++)
//-------------------------------------------------------------//
const int oo = 1e9,LOG = 17,MAXN = 1e5+7,N = 1e2+3;
const int MOD = 1e9+7,MOD1 = 1e9+207,MOD2 = 1e9+407,MOD3 = 998244353;
//-------------------------------------------------------------//
template<typename T1, typename T2> bool mini(T1 &a, T2 b){if(a>b){a=b;return true;}return false;}
template<typename T1, typename T2> bool maxi(T1 &a, T2 b){if(a<b){a=b;return true;}return false;}
template<typename T> T gcd(T a, T b) { while(b) { a %= b; swap(a,b); } return a; }
template<typename T> T lcm(T a, T b) { return a/gcd(a,b)*b; }

/*
----------------------------------------------------------------
    END OF TEMPLATE
----------------------------------------------------------------
    Nguyen Ngoc Hung - nnhzzz
    Training for VOI24 gold medal
----------------------------------------------------------------
*/

int f[MAXN][LOG],pos[MAXN],ok[MAXN];
vi adj[MAXN][2];
int root,times = 0;

int dfs1(int u, int par){
    priority_queue<pii,vpii,greater<pii>> heap;
    for(auto v:adj[u][0]){
        if(v==par){
            continue;
        }
        heap.emplace(dfs1(v,u),v);
    }
    int res = u;
    while(SZ(heap)!=0){
        auto [mi,v] = heap.top(); heap.pop();
        adj[u][1].push_back(v);
        // cerr << u << " " << v << "\n";
        mini(res,mi);
    }
    // cerr << res << " ";
    return res;
}

priority_queue<pii,vpii,greater<pii>> heap;

void dfs2(int u){
    REP(i,1,LOG-1){
        f[u][i] = f[f[u][i-1]][i-1];
    }
    for(auto v:adj[u][1]){
        dfs2(v);
    }
    pos[u] = ++times;
    heap.emplace(pos[u],u);
}

void solve(){
    int n,q; cin >> n >> q;
    REP(u,1,n){
        int v; cin >> v;
        f[u][0] = v;
        if(v==0){
            root = u;
            continue;
        }
        adj[u][0].push_back(v);
        adj[v][0].push_back(u);
    }
    dfs1(root,0); dfs2(root);
    while(q--){
        int res = 0,t,u; cin >> t >> u;
        if(t==1){
            while(u--){
                auto [mi,v] = heap.top(); heap.pop();
                ok[v] = 1; res = v;
            }
        }else{
            REPD(i,LOG-1,0){
                if(ok[f[u][i]]==1){
                    res += MASK(i);
                    u = f[u][i];
                }
            }
            ok[u] = 0;
            heap.emplace(pos[u],u);
        }
        cout << res << "\n";
    }
}

__nnhzzz__{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    #define name "test"
    if(fopen(name".inp","r")){
        freopen(name".inp","r",stdin);
        freopen(name".out","w",stdout);
    }
    #define name1 "nnhzzz"
    if(fopen(name1".inp","r")){
        freopen(name1".inp","r",stdin);
        freopen(name1".out","w",stdout);
    }

    int test = 1;

    while(test--){
      solve();
    }
    cerr << "\nTime elapsed: " << 1000*clock()/CLOCKS_PER_SEC << "ms\n";
    return 0;
}

Compilation message

ballmachine.cpp: In function 'int dfs1(int, int)':
ballmachine.cpp:100:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  100 |         auto [mi,v] = heap.top(); heap.pop();
      |              ^
ballmachine.cpp: In function 'void solve()':
ballmachine.cpp:139:22: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  139 |                 auto [mi,v] = heap.top(); heap.pop();
      |                      ^
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:161:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |         freopen(name".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp:162:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  162 |         freopen(name".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp:166:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  166 |         freopen(name1".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp:167:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  167 |         freopen(name1".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 67 ms 14880 KB Output is correct
3 Correct 56 ms 14716 KB Output is correct
4 Correct 3 ms 4948 KB Output is correct
5 Correct 2 ms 5076 KB Output is correct
6 Correct 3 ms 5164 KB Output is correct
7 Correct 3 ms 5172 KB Output is correct
8 Correct 3 ms 5204 KB Output is correct
9 Correct 6 ms 5696 KB Output is correct
10 Correct 14 ms 7524 KB Output is correct
11 Correct 58 ms 14968 KB Output is correct
12 Correct 52 ms 14728 KB Output is correct
13 Correct 57 ms 14900 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 11072 KB Output is correct
2 Correct 96 ms 26972 KB Output is correct
3 Correct 62 ms 19620 KB Output is correct
4 Correct 39 ms 12256 KB Output is correct
5 Correct 42 ms 12180 KB Output is correct
6 Correct 37 ms 12112 KB Output is correct
7 Correct 37 ms 10716 KB Output is correct
8 Correct 33 ms 11060 KB Output is correct
9 Correct 87 ms 27436 KB Output is correct
10 Correct 97 ms 27060 KB Output is correct
11 Correct 90 ms 26972 KB Output is correct
12 Correct 104 ms 23148 KB Output is correct
13 Correct 84 ms 31508 KB Output is correct
14 Correct 61 ms 19644 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 46 ms 16400 KB Output is correct
2 Correct 103 ms 23668 KB Output is correct
3 Correct 85 ms 29272 KB Output is correct
4 Correct 76 ms 22948 KB Output is correct
5 Correct 68 ms 22496 KB Output is correct
6 Correct 68 ms 22612 KB Output is correct
7 Correct 70 ms 19696 KB Output is correct
8 Correct 91 ms 29188 KB Output is correct
9 Correct 113 ms 27656 KB Output is correct
10 Correct 100 ms 27164 KB Output is correct
11 Correct 100 ms 27252 KB Output is correct
12 Correct 98 ms 23616 KB Output is correct
13 Correct 117 ms 35620 KB Output is correct
14 Correct 98 ms 20424 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 106 ms 27712 KB Output is correct
2 Correct 95 ms 23664 KB Output is correct
3 Correct 101 ms 34836 KB Output is correct
4 Correct 156 ms 27716 KB Output is correct
5 Correct 115 ms 27176 KB Output is correct
6 Correct 95 ms 27120 KB Output is correct
7 Correct 101 ms 23644 KB Output is correct
8 Correct 83 ms 34892 KB Output is correct
9 Correct 61 ms 19748 KB Output is correct