제출 #921790

#제출 시각아이디문제언어결과실행 시간메모리
921790asdasdqwerHappiness (Balkan15_HAPPINESS)C++14
100 / 100
772 ms244016 KiB
// #pragma GCC optimize("O3")
// #pragma GCC target("avx,avx2,sse4")

#include "happiness.h"
#include <vector>
using namespace std;

struct Node {
    // sum that is required such that the first element of the subarray is chosen
    long long reqSum = 0;

    // sum of all elements in the subarray
    long long buildSum = 0;

    // index of left and right children
    int lIdx = -1, rIdx = -1;
};

const long long n=((long long)1LL)<<40;
Node n1;
vector<Node> seg(10000000,n1);
int pt=0;
vector<int> st(100,0);
long long x,lx,rx;
int pp=-1;
int i=0;

inline void combine(Node &ret, Node &l, Node &r) {
	ret.reqSum = l.reqSum;
	if (r.buildSum != 0)
		ret.reqSum = max(l.reqSum, r.reqSum - l.buildSum);
}

inline void inc(long long i, long long v) {
	x=0;lx=0;rx=n;

	while (rx-lx!=1) {
		seg[x].buildSum += v;
		st[++pp]=x;
		long long m=(lx+rx)>>1;
		if (i<m) {
			rx=m;
			if (seg[x].lIdx == -1) {
				seg[x].lIdx = ++pt;
				if (rx-lx==1) seg[pt].reqSum = lx-1;
			}
			x=seg[x].lIdx;
		}

		else {
			lx=m;
			if (seg[x].rIdx == -1) {
				seg[x].rIdx = ++pt;
				if (rx-lx==1) seg[pt].reqSum = lx-1;
			}
			x=seg[x].rIdx;
		}
	}

	seg[x].buildSum += v;
	for (;pp>-1;--pp) {
		if (seg[st[pp]].lIdx == -1) {
			seg[st[pp]].reqSum = seg[seg[st[pp]].rIdx].reqSum;
		}

		else if (seg[st[pp]].rIdx == -1) {
			seg[st[pp]].reqSum = seg[seg[st[pp]].lIdx].reqSum;
		}

		else
			combine(seg[st[pp]], seg[seg[st[pp]].lIdx], seg[seg[st[pp]].rIdx]);
	}
}

bool init(int coinsCount, long long maxCoinSize, long long coins[]) {
    for (i=0;i<coinsCount;++i) {
        inc(coins[i], coins[i]);
    }
    
	return seg[0].reqSum < 1;
}

bool is_happy(int event, int coinsCount, long long coins[]) {
    if (event == -1) {
        for (i=0;i<coinsCount;++i) {
            inc(coins[i], -coins[i]);
        }
    }

    else {
        for (i=0;i<coinsCount;++i) {
            inc(coins[i], coins[i]);
        }
    }
    return seg[0].reqSum < 1;

}

컴파일 시 표준 에러 (stderr) 메시지

grader.cpp: In function 'int main()':
grader.cpp:16:12: warning: unused variable 'max_code' [-Wunused-variable]
   16 |  long long max_code;
      |            ^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...