답안 #275955

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
275955 2020-08-20T08:36:34 Z 반딧불(#5115) Happiness (Balkan15_HAPPINESS) C++17
0 / 100
1 ms 384 KB
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
#include "happiness.h"

using namespace std;

typedef long long ll;
const ll INF = 1e18;

struct Node{
    ll s, e;
    ll sum = 0;
    ll v = INF, lazy = 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;
    }

    void propagate(){
        if(l) l->lazy += lazy;
        if(r) r->lazy += lazy;
        v += lazy;
        lazy = 0;
    }

    ll minSum(ll idx){ /// returning sum
        if(idx <= s) return 0;
        if(e < idx) return sum;
        ll ret = 0;
        if(l) ret += l->minSum(idx);
        if(r) 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)/2;
        if(idx <= m+1){
            if(l) return l->minMax(idx);
            return 0;
        }
        if(r){
            ll tmp = r->minMax(idx);
            if(tmp) return tmp;
        }
        if(l){
            ll tmp = l->minMax(idx);
            if(tmp) return tmp;
        }
        return 0;
    }
    ll maxMin(ll idx){ /// returning value
        if(e <= idx) return INF;
        if(s==e) return s;
        ll m = (s+e)/2;
        if(m <= idx){
            if(r) return r->maxMin(idx);
            return INF;
        }
        if(l){
            ll tmp = l->maxMin(idx);
            if(tmp != INF) return tmp;
        }
        if(r){
            ll tmp = r->maxMin(idx);
            if(tmp != INF) return tmp;
        }
        return INF;
    }

    void addKey(ll _s, ll _e, ll val){
        propagate();
        if(e < _s || s > _e) return;
        if(_s <= s && e <= _e){
            lazy += val;
            propagate();
            return;
        }
        if(l) l->addKey(_s, _e, val);
        if(r) r->addKey(_s, _e, val);
        v = min(l?l->v:INF, r?r->v:INF);
    }

    void addValue(ll idx, ll val){
        if(s==e){
            sum += val;
            root->addKey(idx+1, INF, val);
            if(v == INF) v = root->minSum(idx) - idx;
            return;
        }
        ll m = (s+e)/2;
        if(idx <= m){
            if(!l) l = new Node(s, m, root);
            l->addValue(idx, val);
            if(!l->sum) delete l, l=nullptr;
        }
        else{
            if(!r) r = new Node(m+1, e, root);
            r->addValue(idx, val);
            if(!r->sum) delete r, r=nullptr;
        }
        if(l) l->propagate();
        if(r) r->propagate();
        sum = (!l ? 0 : l->sum) + (!r ? 0 : r->sum);
        v = min(!l ? INF: l->v, !r ? INF : r->v);
    }
};
Node* root;

bool isAble(){
    if(root->v >= -1) return true;
    return false;
}

bool init(int coinsCount, ll maxCoinSize, ll coins[]) {
    root = new Node();
    root->s= 1, root->e = maxCoinSize;
    root->root = root;

    for(int i=0; i<coinsCount; i++){
        root->addValue(coins[i], coins[i]);
    }
    return isAble();
}

bool is_happy(int event, int coinsCount, ll coins[]){
    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 0 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 256 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Incorrect 1 ms 384 KB Output isn't correct
4 Halted 0 ms 0 KB -