Submission #1210609

#TimeUsernameProblemLanguageResultExecution timeMemory
1210609PenguinsAreCuteWorst Reporter 4 (JOI21_worst_reporter4)C++17
0 / 100
0 ms324 KiB
#include <bits/stdc++.h>
using namespace std;
/*
template<typename T>
struct fenwick {
	int s;
	vector<T> ty;
	fenwick(int _s): s(_s+1), ty(_s+1) {}
	void up(int x, T yx) {
		for(++x;x<s;x+=(x&(-x)))
			ty[x] += yx;
	}
	T qry(int x) {
		T yx = 0;
		for(++x;x;x-=(x&(-x)))
			yx += ty[x];
		return yx;
	}
	int last(T yx) {
		int ans = 0;
		for(int i=31-__builtin_clz(s);i;i--)
			if((ans|(1<<i))<s && ty[ans|(1<<i)] < yx)
				yx-=T[ans|=(1<<i)];
		return ans;
	}
};
*/
mt19937 rng(69);
struct node {
	node *l, *r;
	int pri, key, val, sz;
	long long sum;
	node(int x, int v): pri(rng()), key(x), val(v), sz(1), sum(v), l(NULL), r(NULL) {}
};
long long sum(node *x) {return x?x->sum:0;}
int sz(node *x) {return x?x->sz:0;}
void comp(node *x) {
	x->sum = sum(x->l) + sum(x->r) + x->val;
	x->sz = sz(x->l) + sz(x->r) + 1;
}
void split(int pt, node *x, node *&l, node *&r) {
	if(!x) {
		l=r=NULL;
		return;
	}
	if((x->key) < pt) {
		split(pt,x->r,x->r,r);
		comp(x);
		l=x;
	} else {
		split(pt,x->l,l,x->l);
		comp(x);
		r=x;
	}
}
void merge(node *&x, node *l, node *r) {
	if(!l||!r)
		x = (l?l:r);
	else if(l->pri > r->pri) {
		merge(l->r,l->r,r);
		x = l;
	} else {
		merge(r->l,l,r->l);
		x = r;
	}
	comp(x);
}
int bsta(long long s, node *x) {	
	if(!x)
		assert(0);
	if(sum(x->l)>s)
		return bsta(s, x->l);
	if(sum(x->l) + x->val > s)
		return x->key;
	return  bsta(s-sum(x->l)-x->val,x->r);
}
template<typename F>
void proc(node *x, F f) {
	if(!x)
		return;
	proc(x->l,f);
	f(x);
	proc(x->r,f);
}
int main() {
	int n;
	cin >> n;
	int a[n], h[n], c[n];
	for(int i=0;i<n;i++) {
		cin >> a[i] >> h[i] >> c[i];
		a[i]--;
	}
	node* delta[n];
	for(int i=0;i<n;i++)
		delta[i] = NULL;
	for(int i=n;i--;) {
		node *l, *r;
		split(h[i], delta[i], l, r);
		merge(r, new node(h[i], c[i]), r);
		int pt = (l?bsta(sum(l) - h[i], l):0);
		node *ll, *lr;
		split(pt, l, ll, lr);
		merge(ll, ll, new node(pt, max(0LL, sum(lr) - c[i])));
		merge(delta[i], ll, r);
		if(!i)
			break;
		if(sz(delta[i]) > sz(delta[a[i]]))
			swap(delta[i], delta[a[i]]);
		node *&par = delta[a[i]];
		auto ins = [&par](node *k) {
			node *l, *r;
			split(k->val, par, l, r);
			merge(par, l, new node(k->key, k->val));
			merge(par, par, r);
		};
		proc(delta[i], ins);
		int hi = a[i];
	}
	long long ans = -delta[0]->sum;
	for(int i=0;i<n;i++)
		ans += c[i];
	cout << ans;
	/*
	for(int i=n;--i;)
		sub[a[i]] += sub[i];
	hp[0]=0;
	for(int i=0;i<n;i++)
		if(adj[i].size()) {
			pair<int,int> bst = {-1,-1};
			for(auto j: adj[i])
				bst=max(bst,{sub[j],hp[j]=j});
			hp[bst.second] = hp[i];
		}
	*/
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...