제출 #1327087

#제출 시각아이디문제언어결과실행 시간메모리
1327087SmuggingSpun비스킷 담기 (IOI20_biscuits)C++20
100 / 100
17 ms992 KiB
#include "biscuits.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Node{
  ll cnt;
  int lc, rc;
  Node(){
    cnt = 0;
    lc = rc = -1;
  }
};
ll count_tastiness(ll x, vector<ll>a){
  while(a.size() < 60){
    a.push_back(0);
  }
  for(int i = 1; i < 60; i++){
    a[i] = (a[i] << i) + a[i - 1];
  }
  for(ll& v : a){
    v /= x;
  }
  vector<ll>ans(1, 0);
  int root = 0;
  vector<Node>st;
  st.push_back(Node());
  st[0].cnt = 1;
  function<void(int, ll, ll, ll, ll)>fill_zero;
  fill_zero = [&] (int id, ll l, ll r, ll u, ll v){
    if(l > v || r < u){
      return;
    }
    if(u <= l && v >= r){
      st[id] = Node();
      return;
    }
    ll m = (l + r) >> 1;
    if(st[id].lc != -1){
      st.push_back(st[st[id].lc]);
      fill_zero(st[id].lc = int(st.size()) - 1, l, m, u, v);
    }
    if(st[id].rc != -1){
      st.push_back(st[st[id].rc]);
      fill_zero(st[id].rc = int(st.size()) - 1, m + 1, r, u, v);
    }
    st[id].cnt = (st[id].lc == -1 ? 0 : st[st[id].lc].cnt) + (st[id].rc == -1 ? 0 : st[st[id].rc].cnt);
  };
  for(int bit = 0; bit < 60; bit++){
    int right_node = st.size();
    st.push_back(st[root]);
    fill_zero(right_node, 1LL << bit, (1LL << (bit + 1)) - 1, max(1LL << bit, a[bit] + 1), (1LL << (bit + 1)) - 1);
    int new_root = st.size();
    st.push_back(Node());
    st[new_root].cnt = st[st[new_root].lc = root].cnt + st[st[new_root].rc = right_node].cnt;
    root = new_root;
  }
  return st[root].cnt;
}
#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...