제출 #86759

#제출 시각아이디문제언어결과실행 시간메모리
86759Weak123456Divide and conquer (IZhO14_divide)C++17
17 / 100
157 ms9292 KiB
#include<bits/stdc++.h>
#define P pair<lli, lli>
#define x first
#define y second
#define mp make_pair
using namespace std;
typedef long long int lli;
const lli N=100009, inf=1e16;
lli n, l[N], r[N], b[N], s[N], sg[N];
struct T
{
	lli x, g, e;
};
T a[N];
void Inp()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].g>>a[i].e;
		s[i]=s[i-1]+a[i].e;
		sg[i]=sg[i-1]+a[i].g;
	}
}
void FindL()
{
	a[n+1].x=inf;
	deque<lli> p;
	for(int i=1;i<=n;i++)
	{
		b[i]=b[i-1]-(a[i+1].x-a[i].x)+a[i].e;
	}
	for(int i=0;i<=n;i++)
	{
		while(!p.empty())
		{
			if(b[p.back()]>b[i])
			{
				r[p.back()+1]=i;
				p.pop_back();
			}
			else
			{
				break;
			}
		}
		p.push_back(i);
	}
	r[n]=n;
}
void FindR()
{
	b[n+1]=0;
	a[0].x=-inf;
	for(int i=n;i>=1;i--)
	{
		b[i]=b[i+1]+a[i].e-(a[i].x-a[i-1].x);
	}
	deque<lli> p;
	for(int i=n+1;i>=1;i--)
	{
		while(!p.empty())
		{
			if(b[p.back()]>b[i])
			{
				l[p.back()-1]=i;
				p.pop_back();
			}
			else
			{
				break;
			}
		}
		p.push_back(i);
	}
	l[1]=1;
}
struct T1
{
	lli l, r, x;
};
deque<T1> p, q;
void Fixed()
{
	for(int i=1;i<=n;i++)
	{
		r[i]=a[i].x+s[r[i]]-s[i-1];
		l[i]=a[i].x-(s[i]-s[l[i]-1]);
	}
	lli maxx=-inf, minn=inf;
	for(int i=1;i<=n;i++)
	{
		if(r[i]>maxx)
		{
			maxx=r[i];
			p.push_back({a[i].x, r[i], i});
		}
	}
	for(int i=n;i>=1;i--)
	{
		if(l[i]<minn)
		{
			minn=l[i];
			q.push_front({l[i], a[i].x, i});
		}
	}
}
void Solve()
{
	lli kq=0, s1=p.size(), s2=q.size(), v=0;
	for(int i=0;i<s1;i++)
	{
		while(v<s2)
		{
			if(q[v].l>p[i].r)
			{
				break;
			}
			v++;
		}
		kq=max(kq, sg[q[v-1].x]-sg[p[i].x-1]);
	}
	cout<<kq;
}
int main()
{
	//freopen("test.inp","r",stdin);
	Inp();
	FindL();
	FindR();
	Fixed();
	Solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...