Submission #946499

# Submission time Handle Problem Language Result Execution time Memory
946499 2024-03-14T17:22:31 Z infrapolar Happiness (Balkan15_HAPPINESS) C++17
100 / 100
1574 ms 464760 KB
#include "happiness.h"
#include <cstdint>
#include <algorithm>
#include <functional>
#include <map>
using namespace std;
struct Node;
int64_t tree_block = 7e5; // N+K*Q
int64_t tree_size ; // M*(N+K*Q)
int64_t mem[(int)6e7];
Node* node_storage = (Node*)mem;
int storage_end = 0;
struct Node{
	int left = -1, right = -1;
	int64_t mn_diff = 0; //S - i
	Node(){}
	void add_lazy(int64_t _lazy){
		mn_diff += _lazy;
	}
	void check_children(){
		if (left == -1){
			left = storage_end++;
			right = storage_end++;
			node_storage[left] = Node();
			node_storage[right] = Node();
		}
	}
	void push(){
		check_children();
		int64_t lazy = mn_diff - min(node_storage[left].mn_diff, node_storage[right].mn_diff);
		node_storage[left].add_lazy(lazy);
		node_storage[right].add_lazy(lazy);
	}
	void add(int64_t l, int64_t r, int64_t x, int64_t node_l, int64_t node_r){
		if (l > node_r || r < node_l)
			return;
		if (l <= node_l && node_r <= r)
			return add_lazy(x);
		push();
		int64_t mid = (node_l + node_r)/2;
		node_storage[left].add(l, r, x, node_l, mid);
		node_storage[right].add(l, r, x, mid+1, node_r);
		mn_diff = min(node_storage[left].mn_diff, node_storage[right].mn_diff);
	}


};
unordered_map<int64_t, int64_t> cur_ptr;
Node root;
int64_t inf = tree_size*2;
int64_t M;
int64_t find_to_insert(int64_t x){
	return (tree_block * x) + (cur_ptr[x]++);
}
int64_t find_to_delete(int64_t x){
	return (tree_block * x) + (--cur_ptr[x]);
}

bool is_happy(int event, int coinsCount, long long coins[]) {
	int sign = event;
	function<int64_t(int64_t)> find_place = find_to_insert;
	if (event == -1)
		find_place = find_to_delete;
	for (int i = 0; i < coinsCount; i++)
	{
		int64_t place = find_place(coins[i]);
		root.add(place, place, (-inf-coins[i]) * sign, 0, tree_size);
		root.add(place+1, tree_size, sign * coins[i], 0, tree_size);
	}
	

	return root.mn_diff >= 0;
}
bool init(int coinsCount, long long maxCoinSize, long long coins[]) {
	M = maxCoinSize;
	tree_size = (M+1)*tree_block;
	root = Node();
	root.add(0, tree_size, 1, 0, tree_size);
	root.add(0, tree_size, inf, 0, tree_size);
	
	return is_happy(1, coinsCount, coins);
}

Compilation message

grader.cpp: In function 'int main()':
grader.cpp:16:12: warning: unused variable 'max_code' [-Wunused-variable]
   16 |  long long max_code;
      |            ^~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 3 ms 3416 KB Output is correct
7 Correct 3 ms 3420 KB Output is correct
8 Correct 30 ms 16460 KB Output is correct
9 Correct 29 ms 16220 KB Output is correct
10 Correct 26 ms 16216 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 683 ms 137784 KB Output is correct
7 Correct 632 ms 135832 KB Output is correct
8 Correct 627 ms 137948 KB Output is correct
9 Correct 1055 ms 195868 KB Output is correct
10 Correct 1080 ms 223900 KB Output is correct
11 Correct 548 ms 238960 KB Output is correct
12 Correct 567 ms 238904 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 3 ms 3416 KB Output is correct
7 Correct 3 ms 3420 KB Output is correct
8 Correct 30 ms 16460 KB Output is correct
9 Correct 29 ms 16220 KB Output is correct
10 Correct 26 ms 16216 KB Output is correct
11 Correct 683 ms 137784 KB Output is correct
12 Correct 632 ms 135832 KB Output is correct
13 Correct 627 ms 137948 KB Output is correct
14 Correct 1055 ms 195868 KB Output is correct
15 Correct 1080 ms 223900 KB Output is correct
16 Correct 548 ms 238960 KB Output is correct
17 Correct 567 ms 238904 KB Output is correct
18 Correct 981 ms 274068 KB Output is correct
19 Correct 968 ms 284540 KB Output is correct
20 Correct 1574 ms 464760 KB Output is correct
21 Correct 928 ms 244952 KB Output is correct
22 Correct 785 ms 239228 KB Output is correct
23 Correct 774 ms 238972 KB Output is correct
24 Correct 925 ms 268152 KB Output is correct