제출 #1256814

#제출 시각아이디문제언어결과실행 시간메모리
1256814ssitaramHappiness (Balkan15_HAPPINESS)C++20
0 / 100
1 ms320 KiB
#include <bits/stdc++.h>
#include "happiness.h"
using namespace std;

typedef long long ll;

struct Node {
	Node *l, *r;
	ll mn, lazy;

	Node(int a, int b) : l(nullptr), r(nullptr), mn(-(b - 1)), lazy(0) {}

	void apply(int v) {
		mn += v;
		lazy += v;
	}

	void push(int a, int b) {
		int m = (a + b) / 2;
		if (l == nullptr) l = new Node(a, m);
		if (r == nullptr) r = new Node(m, b);
		l->apply(lazy);
		r->apply(lazy);
		lazy = 0;
	}
};

Node* root;
ll sz = 1, n;
multiset<ll> co;

void ch(Node* here, int l, int r, int a, int b, ll v) {
	if (r <= a || l >= b) return;
	if (a <= l && r <= b) {
		here->apply(v);
		return;
	}
	here->push(l, r);
	int m = (l + r) / 2;
	ch(here->l, l, m, a, b, v);
	ch(here->r, m, r, a, b, v);
	here->mn = min(here->l->mn, here->r->mn);
}

void ch(int a, int b, ll v) {
	ch(root, 0, sz, a, b, v);
}

ll mn(Node* here, int l, int r, int a, int b) {
	if (r <= a || l >= b) return INT64_MAX;
	if (a <= l && r <= b) return here->mn;
	here->push(l, r);
	int m = (l + r) / 2;
	return min(mn(here->l, l, m, a, b), mn(here->r, m, r, a, b));
}

bool good() {
	return mn(root, 0, sz, 1, *prev(co.end()) + 1) >= 0;
}

void add(ll v) {
	co.insert(v);
	ch(v + 1, n, v);
}

void rem(ll v) {
	co.erase(co.find(v));
	ch(v + 1, n, -v);
}

bool init(int coinsCount, long long maxCoinSize, long long coins[]) {
	n = maxCoinSize + 1;
	while (sz < n) sz *= 2;
	root = new Node(0, n);
	ch(1, n, 1);
	for (int i = 0; i < coinsCount; ++i) add(coins[i]);
	return good();
}

bool is_happy(int event, int coinsCount, long long coins[]) {
	for (int i = 0; i < coinsCount; ++i) {
		if (event == 1) add(coins[i]);
		else rem(coins[i]);
	}
	return good();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...