Submission #277965

# Submission time Handle Problem Language Result Execution time Memory
277965 2020-08-21T08:16:36 Z arnold518 Happiness (Balkan15_HAPPINESS) C++14
30 / 100
2000 ms 256672 KB
#pragma GCC optimize ("O3")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")

#include "happiness.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll INF = 1e18;
const int MAXVAL = 7e6;

ll M;
map<ll, int> MM;

struct Node
{
	ll val, lazy;
	int lc, rc, cnt=0;
	Node() : val(0), lazy(0), lc(-1), rc(-1) {} 
};

Node nodes[MAXVAL];
vector<int> pool;

int newNode()
{
	int t=pool.back(); pool.pop_back();
	return t;
}

void deleteNode(int node)
{
	pool.push_back(node);
	nodes[node]=Node();
}	

void busy(int node, ll tl, ll tr)
{
	if(nodes[node].lazy==0) return;
	nodes[node].val+=nodes[node].lazy;
	if(tl!=tr)
	{
		if(nodes[node].lc==-1) nodes[node].lc=newNode();
		nodes[nodes[node].lc].lazy+=nodes[node].lazy;
		if(nodes[node].rc==-1) nodes[node].rc=newNode();
		nodes[nodes[node].rc].lazy+=nodes[node].lazy;
	}
	nodes[node].lazy=0;
}

void update(int node, ll tl, ll tr, ll l, ll r, ll k, int k2)
{
	busy(node, tl, tr);
	if(r<tl || tr<l) return;
	if(l<=tl && tr<=r)
	{
		nodes[node].lazy+=k;
		nodes[node].cnt+=k2;
		return;
	}
	ll mid=tl+tr>>1;

	if(l<=mid)
	{
		if(nodes[node].lc==-1) nodes[node].lc=newNode();
		update(nodes[node].lc, tl, mid, l, r, k, k2);
	}
	if(mid+1<=r)
	{
		if(nodes[node].rc==-1) nodes[node].rc=newNode();
		update(nodes[node].rc, mid+1, tr, l, r, k, k2);
	}

	nodes[node].val=INF;
	if(nodes[node].lc!=-1) nodes[node].val=min(nodes[node].val, nodes[nodes[node].lc].val+nodes[nodes[node].lc].lazy);
	if(nodes[node].rc!=-1) nodes[node].val=min(nodes[node].val, nodes[nodes[node].rc].val+nodes[nodes[node].rc].lazy);
}

int root;

ll query()
{
	return nodes[root].val+nodes[root].lazy;
}

void push(ll x)
{
	update(root, 1, M, x+1, M, x, 1);
	MM[x]++;
	if(MM[x]==1)
	{
		auto it=MM.find(x);
		ll val=-x;
		if(next(it)!=MM.end()) val+=next(it)->first;
		update(root, 1, M, prev(it)->first+1, x, val, 1);
	}
}

void pop(ll x)
{
	update(root, 1, M, x+1, M, -x, -1);
	MM[x]--;
	if(MM[x]==0)
	{
		auto it=MM.find(x);
		ll val=x;
		if(next(it)!=MM.end()) val-=next(it)->first;
		update(root, 1, M, prev(it)->first+1, x, val, -1);
		MM.erase(x);
	}
}

bool init(int coinsCount, ll maxCoinSize, ll coins[])
{	
	for(int i=0; i<MAXVAL; i++) pool.push_back(i);
	M=maxCoinSize;
	root=newNode();
	MM[0];

	for(int i=0; i<coinsCount; i++) push(coins[i]);
	return query()>=-1;
}

bool is_happy(int event, int coinsCount, ll coins[])
{
	if(event == -1) for(int i=0; i<coinsCount; i++) pop(coins[i]);
	else for(int i=0; i<coinsCount; i++) push(coins[i]);
	return query()>=-1;
}

Compilation message

happiness.cpp: In function 'void update(int, ll, ll, ll, ll, ll, int)':
happiness.cpp:65:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   65 |  ll mid=tl+tr>>1;
      |         ~~^~~
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 181 ms 252620 KB Output is correct
2 Correct 183 ms 252492 KB Output is correct
3 Correct 189 ms 252436 KB Output is correct
4 Correct 210 ms 252552 KB Output is correct
5 Correct 198 ms 252544 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 181 ms 252620 KB Output is correct
2 Correct 183 ms 252492 KB Output is correct
3 Correct 189 ms 252436 KB Output is correct
4 Correct 210 ms 252552 KB Output is correct
5 Correct 198 ms 252544 KB Output is correct
6 Correct 195 ms 252572 KB Output is correct
7 Correct 189 ms 252476 KB Output is correct
8 Correct 242 ms 252748 KB Output is correct
9 Correct 247 ms 252732 KB Output is correct
10 Correct 242 ms 252732 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 181 ms 252620 KB Output is correct
2 Correct 183 ms 252492 KB Output is correct
3 Correct 189 ms 252436 KB Output is correct
4 Correct 210 ms 252552 KB Output is correct
5 Correct 198 ms 252544 KB Output is correct
6 Correct 1453 ms 256672 KB Output is correct
7 Correct 1402 ms 255900 KB Output is correct
8 Correct 1328 ms 255900 KB Output is correct
9 Execution timed out 2064 ms 255724 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 181 ms 252620 KB Output is correct
2 Correct 183 ms 252492 KB Output is correct
3 Correct 189 ms 252436 KB Output is correct
4 Correct 210 ms 252552 KB Output is correct
5 Correct 198 ms 252544 KB Output is correct
6 Correct 195 ms 252572 KB Output is correct
7 Correct 189 ms 252476 KB Output is correct
8 Correct 242 ms 252748 KB Output is correct
9 Correct 247 ms 252732 KB Output is correct
10 Correct 242 ms 252732 KB Output is correct
11 Correct 1453 ms 256672 KB Output is correct
12 Correct 1402 ms 255900 KB Output is correct
13 Correct 1328 ms 255900 KB Output is correct
14 Execution timed out 2064 ms 255724 KB Time limit exceeded
15 Halted 0 ms 0 KB -