This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |