Submission #68438

#TimeUsernameProblemLanguageResultExecution timeMemory
68438ekremDivide and conquer (IZhO14_divide)C++98
100 / 100
300 ms33916 KiB
#include <bits/stdc++.h>
#define st first
#define nd second
#define mp make_pair
#define pb push_back
#define inf 1000000007
#define orta ((bas + son)/2)
#define sol (k+k)
#define sag (k+k+1)
#define N 1000005
using namespace std;

typedef long long ll;

ll n, m, ans, a[N], b[N], c[N], suf[N], gol[N], seg[4*N];
pair < ll , ll > mx;
map < ll , ll > h, yer;
map < ll , ll > :: iterator it;

void up(ll k, ll bas, ll son, ll x, ll y){
	if(bas == son){
		seg[k] = min(seg[k], y);
		return;
	}
	if(x <= orta)
		up(sol, bas, orta, x, y);
	else
		up(sag, orta + 1, son, x, y);
	seg[k] = min(seg[sol] , seg[sag]);
}

ll qu(ll k, ll bas, ll son, ll x, ll y){
	if(bas > y or son < x)
		return inf;
	if(bas >= x and son <= y)
		return seg[k];
	return min(qu(sol, bas, orta, x, y), qu(sag, orta + 1, son, x, y));
}

void bu(ll k, ll bas, ll son){
	if(bas == son){
		seg[k] = inf;
		return;
	}
	bu(sol, bas, orta);
	bu(sag, orta + 1, son);
	seg[k] = inf;
}

int main() {
	// freopen("in.txt", "r", stdin);
	// freopen("outt.txt", "w", stdout);
	scanf("%lld",&n);
	for(ll i = 1; i <= n; i++)
		scanf("%lld %lld %lld",a + i, b + i, c + i);
	for(ll i = n; i >= 1; i--){
		suf[i] = suf[i + 1] + c[i];
		gol[i] = gol[i + 1] + b[i];
		h[suf[i] + a[i] ]++;
		h[suf[i + 1] + a[i] ]++;
	}
	for(it = h.begin(); it != h.end(); it++)
		yer[it->st] = ++m;

	bu(1, 1, m);

	for(ll i = 1; i <= n; i++){
		up(1, 1, m, yer[suf[i] + a[i] ], i);
		ll j = qu(1, 1, m, yer[suf[i + 1] + a[i] ], m);
		ans = max(ans, gol[j] - gol[i + 1]);
		// cout << j << " , " << i << " -> " << gol[j] << " , " << gol[i + 1] << " -> " << ans << endl;
	}
	printf("%lld\n", ans);
	return 0;
}

Compilation message (stderr)

divide.cpp: In function 'int main()':
divide.cpp:53:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld",&n);
  ~~~~~^~~~~~~~~~~
divide.cpp:55:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld %lld %lld",a + i, b + i, c + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...