제출 #71842

#제출 시각아이디문제언어결과실행 시간메모리
71842dooweyBall Machine (BOI13_ballmachine)C++14
47.88 / 100
278 ms49408 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef long double db;
typedef pair<int,int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO std::ios::sync_with_stdio(false);cin.tie(NULL);
#define TEST freopen("in.txt","r",stdin);
#define ones(a) __builtin_popcount(a);
#define pq priority_queue

const int N = (int)1e5 + 9;
const int LOG = 18;
vector<int> T[N];
int min_leaf[N];
int up[N][LOG];

void dfs1(int node,int par){
  min_leaf[node] = 21344567;
  up[node][0] = par;
  for(int i = 1;i < LOG;i ++ ){
    if(up[node][i - 1] != -1)
      up[node][i] = up[up[node][i - 1]][i - 1];
  }
  for(auto x : T[node]){
    dfs1(x, node);
    min_leaf[node] = min(min_leaf[node], min_leaf[x]);
  }
  if(T[node].empty())
    min_leaf[node] = node;
}

int tt;
int porder[N];
int pos[N];
bool is[N]; 

void dfs2(int node){
  vector<pii> nex;
  porder[tt] = node;
  pos[node] = tt++;
  for(auto x : T[node])
    nex.push_back(mp(min_leaf[x], x));
  sort(nex.begin(), nex.end());
  for(int i = (int)nex.size() - 1;i >= 0;i -- ){
    dfs2(nex[i].se);
  }
}

pq<int> emp;

int ins(int k){
  int fr;
  for(int i = 0;i < k;i ++ ){
    fr = emp.top();
    emp.pop();
    is[porder[fr]] = true;
  }
  return porder[fr];
}

int rem(int ix){
  int sum = 0;
  int go = ix;
  for(int i = LOG-1;i >= 0 ;i -- ){
    if(up[go][i] == -1)
      continue;
    if(is[up[go][i]]){
      sum += (1 << i);
      go = up[go][i];
    }
  }
  is[go] = false;
  emp.push(pos[go]);
  return sum;
}

int main(){
  fastIO;
  memset(up, -1, sizeof up);
  int n, q;
  cin >> n >> q;
  for(int i = 0;i <= n;i ++ )
    is[i] = false;
  int x;
  int root;
  for(int i = 1;i <= n;i ++ ){
    cin >> x;
    if(x == 0)
      root = i;
    else
      T[x].push_back(i);
  }
  dfs1(root, -1);
  dfs2(root);
  for(int i = 0;i < tt;i ++ )
    emp.push(i);
  int ty, bl;
  for(int i = 0;i < q;i ++ ){
    cin >> ty >> bl;
    if(ty == 1)
      cout << ins(bl) << "\n";
    else
      cout << rem(bl) << "\n";
  }
  return 0;
}

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

ballmachine.cpp: In function 'int ins(int)':
ballmachine.cpp:60:7: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
   int fr;
       ^~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:60:7: warning: 'fr' may be used uninitialized in this function [-Wmaybe-uninitialized]
ballmachine.cpp:102:7: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
   dfs2(root);
   ~~~~^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...