Submission #277886

# Submission time Handle Problem Language Result Execution time Memory
277886 2020-08-21T07:53:04 Z arnold518 Happiness (Balkan15_HAPPINESS) C++14
30 / 100
2000 ms 477176 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 = 2e7;

ll M;
map<ll, int> MM;

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

Node nodes[MAXVAL];
int ncnt=0;

int newNode()
{
	if(ncnt==MAXVAL) assert(0);
	return ncnt++;
}

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)
{
	busy(node, tl, tr);
	if(r<tl || tr<l) return;
	if(l<=tl && tr<=r)
	{
		nodes[node].lazy+=k;
		return;
	}
	ll mid=tl+tr>>1;
	if(nodes[node].lc==-1) nodes[node].lc=newNode();
	if(nodes[node].rc==-1) nodes[node].rc=newNode();
	update(nodes[node].lc, tl, mid, l, r, k);
	update(nodes[node].rc, mid+1, tr, l, r, k);

	nodes[node].val=INF;
	nodes[node].val=min(nodes[node].val, nodes[nodes[node].lc].val+nodes[nodes[node].lc].lazy);
	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);
	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);
	}
}

void pop(ll x)
{
	update(root, 1, M, x+1, M, -x);
	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);
		MM.erase(x);
	}
}

bool init(int coinsCount, ll maxCoinSize, ll coins[])
{
	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)':
happiness.cpp:58:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   58 |  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 270 ms 470008 KB Output is correct
2 Correct 274 ms 469972 KB Output is correct
3 Correct 297 ms 470008 KB Output is correct
4 Correct 266 ms 470008 KB Output is correct
5 Correct 271 ms 470032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 270 ms 470008 KB Output is correct
2 Correct 274 ms 469972 KB Output is correct
3 Correct 297 ms 470008 KB Output is correct
4 Correct 266 ms 470008 KB Output is correct
5 Correct 271 ms 470032 KB Output is correct
6 Correct 273 ms 469984 KB Output is correct
7 Correct 276 ms 470008 KB Output is correct
8 Correct 348 ms 470804 KB Output is correct
9 Correct 338 ms 470648 KB Output is correct
10 Correct 341 ms 470648 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 270 ms 470008 KB Output is correct
2 Correct 274 ms 469972 KB Output is correct
3 Correct 297 ms 470008 KB Output is correct
4 Correct 266 ms 470008 KB Output is correct
5 Correct 271 ms 470032 KB Output is correct
6 Correct 1522 ms 477124 KB Output is correct
7 Correct 1451 ms 477092 KB Output is correct
8 Correct 1530 ms 477176 KB Output is correct
9 Execution timed out 2118 ms 476988 KB Time limit exceeded
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 270 ms 470008 KB Output is correct
2 Correct 274 ms 469972 KB Output is correct
3 Correct 297 ms 470008 KB Output is correct
4 Correct 266 ms 470008 KB Output is correct
5 Correct 271 ms 470032 KB Output is correct
6 Correct 273 ms 469984 KB Output is correct
7 Correct 276 ms 470008 KB Output is correct
8 Correct 348 ms 470804 KB Output is correct
9 Correct 338 ms 470648 KB Output is correct
10 Correct 341 ms 470648 KB Output is correct
11 Correct 1522 ms 477124 KB Output is correct
12 Correct 1451 ms 477092 KB Output is correct
13 Correct 1530 ms 477176 KB Output is correct
14 Execution timed out 2118 ms 476988 KB Time limit exceeded
15 Halted 0 ms 0 KB -