Submission #1160571

#TimeUsernameProblemLanguageResultExecution timeMemory
1160571ImperialALENBigger segments (IZhO19_segments)C++20
100 / 100
126 ms28032 KiB
// #pragma GCC optomize ("Ofast")
// #pragma GCC optomize ("unroll-loops")
// #pragma GCC target ("avx,avx2,fma")
#include <bits/stdc++.h> 
  
#define F first
#define S second 
#define ll long long
#define int long long
#define pb push_back
#define all(x) (x.begin(),x.end())
#define	ios	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);	
 
using namespace std;
  
const ll N = 5e5+9, INF = 1e18 , inf = 1e9+9, mod = 1e9+9;

int n;

int a[N];
int dp[N];
int pref[N];

vector<int>t(N*4,INF);

void upd(int ind,int val,int u=1,int ul=1,int ur=n){
	if(ul==ur){
		t[u]=val;
		return;
	}	
	int um=(ul+ur)/2;
	if(ind<=um)upd(ind,val,u*2,ul,um);
	else upd(ind,val,u*2+1,um+1,ur);
	t[u]=min(t[u*2],t[u*2+1]);
}

int get(int x,int u=1,int ul=1,int ur=n){
	if(ul==ur)return ul;
	int um=(ul+ur)/2;
	if(t[u*2+1]<=x){
		return get(x,u*2+1,um+1,ur);
	}else return get(x,u*2,ul,um);
}

signed main(){
	ios;
	int tt=1;
//	cin>>tt;
	while(tt--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			pref[i]=pref[i-1]+a[i];
		}		
		for(int i=1;i<=n;i++){
			int j=0;
			if(t[1]<=pref[i])j=get(pref[i]);
			dp[i]=dp[j]+1;
//			cout<<j<<" "<<pref[i]+(pref[i]-pref[j])<<'\n';
			upd(i,pref[i]+(pref[i]-pref[j]));
		}
		cout<<dp[n];
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...