Submission #1214874

#TimeUsernameProblemLanguageResultExecution timeMemory
1214874Math4Life2020Packing Biscuits (IOI20_biscuits)C++20
100 / 100
28 ms1092 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;
using ui = __int128_t; using ui4 = array<ui,4>;

#include "biscuits.h"

vector<ui4> mem;
//left, right, height, # contained
ll root;

ll split(ll v, ll y) {
    //handle height = -1
    ll ht = mem[v][2];
    if (ht==-1) {
        mem.push_back({-1,-1,-1,1});
        return (mem.size()-1);
    }
    if (y>=(((ui)1)<<ht)) {
        if (mem[v][1]!=-1) {
            ll vnew = split(mem[v][1],y-(((ui)1)<<ht));
            mem.push_back({mem[v][0],vnew,ht,mem[mem[v][0]][3]+mem[vnew][3]});
        } else {
            mem.push_back({mem[v][0],-1,ht,mem[mem[v][0]][3]});
        }
        return (mem.size()-1);
    } else {
        ll vnew = split(mem[v][0],y);
        mem.push_back({vnew,-1,ht,mem[vnew][3]});
        return (mem.size()-1);
    }
}

ll count_tastiness(ll x, vector<ll> a0) {
    ll k = a0.size();
    mem.clear();
    mem.push_back({-1,-1,-1,1});
    root = 0;
    while (a0.size()<=60) {
        a0.push_back(0);
    }
    k = a0.size();
    ui y0 = 0; //current sum
    for (ll i=0;i<k;i++) {
        y0 += ((ui)a0[i])<<i;
        ui z0 = y0/x;
        z0 = min(z0,(((ui)1)<<(i+1))-1);
        if (z0>=(((ui)1)<<i)) {
            ll vnew = split(root,z0-(((ui)1)<<(i)));
            mem.push_back({root,vnew,i,mem[root][3]+mem[vnew][3]});
            root = mem.size()-1;
        }
    }
    return mem[root][3];
}
#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...