Submission #182426

#TimeUsernameProblemLanguageResultExecution timeMemory
182426mahmoudbadawyDivide and conquer (IZhO14_divide)C++17
100 / 100
277 ms12532 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=1e5+5;

int x[N],g[N],e[N];
long long gs[N],es[N],dp[N],btree[8*N];
int n;
vector<long long> cmp;

int get(long long x)
{
	return lower_bound(cmp.begin(),cmp.end(),x)-cmp.begin();
}

void update(int node,int l,int r,int ind,long long val)
{
	//if(ind<l||ind>r) return;
	if(l==r)
	{
		btree[node]=max(btree[node],val);
		return;
	}
	int mid=(l+r)/2;
	if(ind<=mid)
		update(node*2,l,mid,ind,val);
	else
		update(node*2+1,mid+1,r,ind,val);
	btree[node]=max(btree[node*2],btree[node*2+1]);
}

long long query(int node,int l,int r,int ql,int qr)
{
	if(r<ql||qr<l) return 0;
	if(ql<=l&&r<=qr) return btree[node];
	int mid=(l+r)/2;
	return max(query(node*2,l,mid,ql,qr),query(node*2+1,mid+1,r,ql,qr));
}

int main()
{
	cin >> n;
	for(int i=1;i<=n;i++)
	{
		cin >> x[i] >> g[i] >> e[i];
		gs[i]=g[i]+gs[i-1];
		es[i]=e[i]+es[i-1];
		// e[j] - e[i-1] >= (x[j]-x[i])
		// e[j] - x[j] >= e[i-1]-x[i]
		cmp.push_back(es[i]-x[i]);
		cmp.push_back(es[i-1]-x[i]);
	}
	sort(cmp.begin(),cmp.end());
	cmp.erase(unique(cmp.begin(),cmp.end()),cmp.end());
	long long mx=0;
	for(int i=n;i>=1;i--)
	{
		mx=max(mx,1LL*g[i]);
		//cout << es[i-1]-x[i]+1 << " " << es[i]-x[i] << endl;
		dp[i]=max(mx,query(1,0,cmp.size()-1,get(es[i-1]-x[i]),cmp.size()-1)-gs[i-1]);
		//cout << dp[i] << endl;
		mx=max(mx,dp[i]);
		update(1,0,cmp.size()-1,get(es[i]-x[i]),gs[i]);
	}
	cout << dp[1] << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...