Submission #274692

#TimeUsernameProblemLanguageResultExecution timeMemory
274692test2Gap (APIO16_gap)C++14
3.91 / 100
1620 ms1272 KiB
#include<bits/stdc++.h>
#include "gap.h"

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx,avx2,fma")
//#pragma GCC optimization ("unroll-loops")

#define I inline void 

using ll = long long ; 
using ld = long double ; 

using namespace std ; 

const int mod = 1e9 + 7 ; 

// how interesting!

int n; 

vector<ll> v ; 
ll zero = -1 ; 
struct node{
	ll pref = 0 , suff = 0 , summ = 0 , mxx = 0 ; 

	I maint(){
		mxx = max(max(mxx , pref) , max(suff , summ)) ; 
	}

	node(){

	}

	node(ll x){
		pref = suff = summ = x ; 
		maint() ; 
	}

	I merge(node &rhs){
		ll npref = 0 , nsuff = 0 , nsumm = 0 ; 
		if(summ){
			npref = summ + rhs.pref ; 
		}
		else npref = pref ;

		if(summ && rhs.summ){
			nsumm = summ + rhs.summ ; 
		}

		if(rhs.summ){
			nsuff = rhs.summ + suff ;
		}
		else nsuff = rhs.suff ; 
		mxx = max(mxx , suff + rhs.pref) ; 

		pref = npref ; 
		summ = nsumm ; 
		suff = nsuff ;
		mxx = max(mxx , rhs.mxx) ; 
		maint() ; 
	}
} ; 

node query(ll L , ll R){

	ll *mn = &zero  , *mx = &zero; 
	if(L == R){
		MinMax(L , R , mn , mx) ; 
		return node( (*mn) == -1) ; 
	}

	ll mid = (L + R) >> 1ll ; 
	MinMax(L , R , mn , mx) ; 

	if( (*mn) == -1){
		return node(R - L + 1) ; 
	}
	if(L == R)
		return node(0) ; 
	node lhs = query(L , mid) ; 
	node rhs = query(mid+1 , R) ;
	lhs.merge(rhs) ; 
	return lhs ;  
}

long long findGap(int T, int N)
{

	ll st = 0 , en = 1e18 ; 
	
	ll *mn , *mx ; 
	mn =  mx = &zero ; 
	ll lo = 0, hi = 1e18 ; 
 
	while(lo<=hi){
		ll mid  = (lo + hi ) >> 1ll ; 
		MinMax(0 , mid , mn , mx) ; 
		if( (*mx) != -1){
			st = mid ; 
			hi = mid -1 ; 
		}
		else lo = mid + 1; 
	}

	lo = 0 , hi = 1e18 ; 
	while(lo<=hi){
		ll mid = (lo + hi ) >> 1ll ; 
		MinMax(mid , 1e18 , mn , mx ) ; 
		if( (*mx) != -1){
			en = mid ; 
			lo = mid +1 ; 
		}
		else 
			hi = mid - 1; 
	}

	node answer = query(st , en) ; 
	return answer.mxx + 1; 

	return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...