답안 #278124

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
278124 2020-08-21T10:47:43 Z arnold518 Happiness (Balkan15_HAPPINESS) C++14
30 / 100
2000 ms 198260 KB
#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 = 8e6;

ll M;
map<ll, int> MM;

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

Node nodes[MAXVAL];
int ncnt;

int newNode()
{
	assert(ncnt<MAXVAL);
	return ncnt++;
}

void update(int node, ll tl, ll tr, ll p, ll k)
{
	if(tl==tr)
	{
		nodes[node].sum+=k;
		nodes[node].val+=k;
		return;
	}
	ll mid=tl+tr>>1;
	if(p<=mid)
	{
		if(nodes[node].lc==-1) nodes[node].lc=newNode();
		update(nodes[node].lc, tl, mid, p, k);
	}
	else
	{
		if(nodes[node].rc==-1) nodes[node].rc=newNode();
		update(nodes[node].rc, mid+1, tr, p, k);
	}
	nodes[node].sum=0; nodes[node].val=0;
	if(nodes[node].lc!=-1) nodes[node].sum+=nodes[nodes[node].lc].sum;

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

	if(nodes[node].rc!=-1) nodes[node].sum+=nodes[nodes[node].rc].sum;
}

int root;

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

void update2(ll l, ll r, ll x)
{
	if(r<l) return;
	if(l<=M) update(root, 1, M, l, x);
	if(r+1<=M) update(root, 1, M, r+1, -x);
}

void push(ll x)
{
	update2(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;
		update2(prev(it)->first+1, x, val);
	}
}

void pop(ll x)
{
	update2(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;
		update2(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)':
happiness.cpp:39:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   39 |  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;
      |            ^~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 188152 KB Output is correct
2 Correct 113 ms 188152 KB Output is correct
3 Correct 113 ms 188152 KB Output is correct
4 Correct 112 ms 188280 KB Output is correct
5 Correct 115 ms 188152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 188152 KB Output is correct
2 Correct 113 ms 188152 KB Output is correct
3 Correct 113 ms 188152 KB Output is correct
4 Correct 112 ms 188280 KB Output is correct
5 Correct 115 ms 188152 KB Output is correct
6 Correct 120 ms 188280 KB Output is correct
7 Correct 126 ms 188408 KB Output is correct
8 Correct 172 ms 189048 KB Output is correct
9 Correct 161 ms 189304 KB Output is correct
10 Correct 156 ms 189048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 188152 KB Output is correct
2 Correct 113 ms 188152 KB Output is correct
3 Correct 113 ms 188152 KB Output is correct
4 Correct 112 ms 188280 KB Output is correct
5 Correct 115 ms 188152 KB Output is correct
6 Correct 1162 ms 195896 KB Output is correct
7 Correct 1088 ms 195832 KB Output is correct
8 Correct 1114 ms 195496 KB Output is correct
9 Correct 1823 ms 195192 KB Output is correct
10 Execution timed out 2086 ms 198260 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 115 ms 188152 KB Output is correct
2 Correct 113 ms 188152 KB Output is correct
3 Correct 113 ms 188152 KB Output is correct
4 Correct 112 ms 188280 KB Output is correct
5 Correct 115 ms 188152 KB Output is correct
6 Correct 120 ms 188280 KB Output is correct
7 Correct 126 ms 188408 KB Output is correct
8 Correct 172 ms 189048 KB Output is correct
9 Correct 161 ms 189304 KB Output is correct
10 Correct 156 ms 189048 KB Output is correct
11 Correct 1162 ms 195896 KB Output is correct
12 Correct 1088 ms 195832 KB Output is correct
13 Correct 1114 ms 195496 KB Output is correct
14 Correct 1823 ms 195192 KB Output is correct
15 Execution timed out 2086 ms 198260 KB Time limit exceeded
16 Halted 0 ms 0 KB -