#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include "happiness.h"
using namespace std;
typedef long long ll;
unordered_set<ll> st;
struct Node{
ll s, e;
ll sum = 0;
Node *l=nullptr, *r=nullptr, *root=nullptr;
Node(){}
Node(ll s, ll e, Node *root): s(s), e(e), root(root){}
~Node(){
if(l) delete l;
if(r) delete r;
}
ll minSum(ll idx){ /// returning sum
if(idx <= s) return 0;
if(e < idx) return sum;
ll ret = 0;
if(l && l->sum) ret += l->minSum(idx);
if(r && r->sum) ret += r->minSum(idx);
return ret;
}
ll minMax(ll idx){ /// returning value
if(idx <= s) return 0;
if(s==e) return s;
ll m = (s+e)>>1;
if(idx <= m+1){
if(l && l->sum) return l->minMax(idx);
return 0;
}
if(r && r->sum){
ll tmp = r->minMax(idx);
if(tmp) return tmp;
}
if(l && l->sum){
ll tmp = l->minMax(idx);
if(tmp) return tmp;
}
return 0;
}
ll maxMin(ll idx){ /// returning value
if(e <= idx) return LLONG_MAX;
if(s==e) return s;
ll m = (s+e)>>1;
if(m <= idx){
if(r && r->sum) return r->maxMin(idx);
return LLONG_MAX;
}
if(l && l->sum){
ll tmp = l->maxMin(idx);
if(tmp != LLONG_MAX) return tmp;
}
if(r && r->sum){
ll tmp = r->maxMin(idx);
if(tmp != LLONG_MAX) return tmp;
}
return LLONG_MAX;
}
void addValue(ll idx, ll val){
if(s==e){
sum += val;
ll lv = root->minMax(idx);
ll rv = root->maxMin(idx);
if(sum){ /// adding
if(lv*2 < idx) st.insert(idx);
else st.erase(idx);
if(rv != LLONG_MAX){
if(idx*2 < rv) st.insert(rv);
else st.erase(rv);
}
}
else{ /// deleted
st.erase(idx);
if(rv != LLONG_MAX){
if(lv*2 < rv) st.insert(rv);
else st.erase(rv);
}
}
return;
}
ll m = (s+e)>>1;
if(idx <= m){
if(!l) l = new Node(s, m, root);
l->addValue(idx, val);
}
else{
if(!r) r = new Node(m+1, e, root);
r->addValue(idx, val);
}
sum = (!l ? 0 : l->sum) + (!r ? 0 : r->sum);
}
};
Node* root;
int n, cnt;
bool isAble(){
for(auto &x: st){
// printf("strange(%lld) ", x);
if(root->minSum(x) + 1 < x) return false;
}
return true;
}
bool init(int coinsCount, ll maxCoinSize, ll coins[]) {
n = coinsCount;
root = new Node();
root->s= 1, root->e = maxCoinSize;
root->root = root;
for(int i=0; i<n; i++){
root->addValue(coins[i], coins[i]);
}
return isAble();
}
bool is_happy(int event, int coinsCount, ll coins[]) {
n += coinsCount * event;
for(int i=0; i<coinsCount; i++) root->addValue(coins[i], coins[i] * event);
return isAble();
}
Compilation message
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 |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Correct |
1 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Correct |
1 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
7 ms |
2304 KB |
Output is correct |
7 |
Correct |
6 ms |
2560 KB |
Output is correct |
8 |
Correct |
61 ms |
18424 KB |
Output is correct |
9 |
Correct |
68 ms |
18680 KB |
Output is correct |
10 |
Correct |
54 ms |
18040 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Correct |
1 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
886 ms |
45560 KB |
Output is correct |
7 |
Correct |
845 ms |
45048 KB |
Output is correct |
8 |
Correct |
1014 ms |
45560 KB |
Output is correct |
9 |
Correct |
1583 ms |
58744 KB |
Output is correct |
10 |
Correct |
1263 ms |
63920 KB |
Output is correct |
11 |
Correct |
390 ms |
44280 KB |
Output is correct |
12 |
Correct |
605 ms |
44284 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
256 KB |
Output is correct |
2 |
Correct |
0 ms |
384 KB |
Output is correct |
3 |
Correct |
1 ms |
384 KB |
Output is correct |
4 |
Correct |
1 ms |
384 KB |
Output is correct |
5 |
Correct |
1 ms |
384 KB |
Output is correct |
6 |
Correct |
7 ms |
2304 KB |
Output is correct |
7 |
Correct |
6 ms |
2560 KB |
Output is correct |
8 |
Correct |
61 ms |
18424 KB |
Output is correct |
9 |
Correct |
68 ms |
18680 KB |
Output is correct |
10 |
Correct |
54 ms |
18040 KB |
Output is correct |
11 |
Correct |
886 ms |
45560 KB |
Output is correct |
12 |
Correct |
845 ms |
45048 KB |
Output is correct |
13 |
Correct |
1014 ms |
45560 KB |
Output is correct |
14 |
Correct |
1583 ms |
58744 KB |
Output is correct |
15 |
Correct |
1263 ms |
63920 KB |
Output is correct |
16 |
Correct |
390 ms |
44280 KB |
Output is correct |
17 |
Correct |
605 ms |
44284 KB |
Output is correct |
18 |
Execution timed out |
2069 ms |
269524 KB |
Time limit exceeded |
19 |
Halted |
0 ms |
0 KB |
- |