제출 #671608

#제출 시각아이디문제언어결과실행 시간메모리
671608Cutebol금 캐기 (IZhO14_divide)C++17
100 / 100
55 ms15976 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
//void fopn(string name){freopen((name+".in").c_str(),"r",stdin); freopen((name+".out").c_str(),"w",stdout);}
#define Scaramouche ios_base::sync_with_stdio(0) ; cin.tie(0) ; cout.tie(0);
#define int long long
#define itn int
#define endl "\n"
#define ff first
#define ss second
   
const int N = 1e6 + 5 ;
const int mod = 1e9 + 7 ;
const int inf = 1e7 ;

int n , mx ;
vector <int> x , g , a ;
vector <int> pref , prefs ;
map <int , vector <int> > mp ;

void solve(){
	
	cin >> n ;
	x.resize(n) , g.resize(n) , a.resize(n) , pref.resize(n) , prefs.resize(n) ;
	for ( int i = 0 ; i < n ; i ++ )
		cin >> x[i] >> g[i] >> a[i] ;
	pref[0] = a[0] ;
	prefs[0] = g[0] ;
	for ( int i = 1 ; i < n ; i ++ ){
		pref[i] = pref[i-1] ;
		pref[i] += a[i] ;
		prefs[i] = prefs[i-1] + g[i] ;
		mp[pref[i]].push_back(i) ;
	}
	int suf[n];
	suf[n - 1] = pref[n - 1] - x[n - 1];
	for (int i = n - 2; i >= 0; i--) suf[i] = max(suf[i + 1], pref[i] - x[i]); 
	for ( int i = 0 ; i < n ; i ++ ){
		int need = -x[i];
		if (i) need += pref[i - 1];
		int l = i, r = n;
		while (l + 1 < r) {
			int mid = (l + r) >> 1;
			if (suf[mid] >= need) l = mid;
			else r = mid;
		}
		mx = max(mx, prefs[l] - prefs[i] + g[i]);
	}
	cout << mx << endl ;
}
 
signed main(){
//  fopn("talent") ;
    Scaramouche ;
    int t = 1 ;
//      cin >> t ;
    while ( t -- ) solve() ; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...