Submission #1188683

#TimeUsernameProblemLanguageResultExecution timeMemory
1188683sonyaHappiness (Balkan15_HAPPINESS)C++20
10 / 100
2094 ms11432 KiB
#include "happiness.h"
#include <vector>
#include <iostream>
using namespace std;

struct Node {
    int left = 0, right = 0;
    long long count = 0;
};

const long long MAX_VAL = 1e12;
vector<Node> tree(2);
int next_id = 2;

void update(int node, long long l, long long r, long long pos, int diff) {
    if (l == r) {
        tree[node].count += diff;
        return;
    }
    long long mid = (l + r) / 2;
    if (pos <= mid) {
        if (!tree[node].left) {
            tree[node].left = next_id++;
            if (tree.size() <= next_id) tree.resize(next_id + 5);
        }
        update(tree[node].left, l, mid, pos, diff);
    } else {
        if (!tree[node].right) {
            tree[node].right = next_id++;
            if (tree.size() <= next_id) tree.resize(next_id + 5);
        }
        update(tree[node].right, mid + 1, r, pos, diff);
    }

    tree[node].count = 0;
    if (tree[node].left) tree[node].count += tree[tree[node].left].count;
    if (tree[node].right) tree[node].count += tree[tree[node].right].count;
}

bool dfs_check(int node, long long l, long long r, long long &reach) {
    if (!node) return true;
    if (l == r) {
        if (l > reach + 1 && tree[node].count > 0)
            return false;
        reach += tree[node].count * l;
        if (reach >= 1e18) reach = 1e18;
        return true;
    }
    long long mid = (l + r) / 2;

    if (!dfs_check(tree[node].left, l, mid, reach)) return false;
    if (!dfs_check(tree[node].right, mid + 1, r, reach)) return false;
    return true;
}

bool init(int coinsCount, long long maxCoinSize, long long coins[]) {
    tree = vector<Node>(2);
    next_id = 2;
    for (int i = 0; i < coinsCount; ++i)
        update(1, 1, MAX_VAL, coins[i], 1);

    long long reach = 0;
    return dfs_check(1, 1, MAX_VAL, reach);
}

bool is_happy(int event, int coinsCount, long long coins[]) {
    for (int i = 0; i < coinsCount; ++i) {
        if (event == 1) {
            update(1, 1, MAX_VAL, coins[i], 1);
        } else {
            update(1, 1, MAX_VAL, coins[i], -1);
        }
    }

    long long reach = 0;
    return dfs_check(1, 1, MAX_VAL, reach);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...