제출 #287976

#제출 시각아이디문제언어결과실행 시간메모리
287976dvdg6566Bigger segments (IZhO19_segments)C++14
100 / 100
772 ms58884 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pi;
typedef vector<ll> vi;
typedef vector<pi> vpi;
typedef long double ld;
#define pb emplace_back
#define mp make_pair
#define f first
#define s second
#define SZ(x) (ll)x.size()
#define ALL(x) x.begin(),x.end()
#define lb lower_bound
#define ub upper_bound
const ll MAXN=500001;
const ll MOD=1e9+7;
const ll INF = 3e9;

ll A[MAXN];
ll N;

struct node{
	node *l,*r;
	pi v;
	node(){
		v=mp(0,0);
		l=r=nullptr;
	}
	pi ask(ll s,ll e,ll x,ll y){
		ll m=(s+e)/2;
		assert(s<=x&&y<=e);
		if(s==x&&e==y)return v;
		pi t=mp(0,0);
		if(l&&x<=m)t=max(t, l->ask(s,m,x,min(y,m)));
		if(r&&y>m)t=max(t,r->ask(m+1,e,max(m+1,x),y));
		return t;
	}
	void up(ll s,ll e,ll x,pi va){
		ll m=(s+e)/2;
		assert(s<=x&&x<=e);
		if(s==e){v=max(v,va);return;}
		if(x<=m){
			if(!l)l=new node();
			l->up(s,m,x,va);
		}else{
			if(!r)r=new node();
			r->up(m+1,e,x,va);
		}
		v=mp(0,0);
		if(l)v=max(v,l->v);
		if(r)v=max(v,r->v);
	}
}*root;

int main(){
	cin>>N;
	for(int i=1;i<=N;++i){
		cin>>A[i];
		A[i]+=A[i-1];
	}
	vi des;
	for(int i=0;i<=N;++i){
		des.pb(A[i]);
	}
	des.pb(1e18);
	sort(ALL(des));
	des.resize(unique(ALL(des)) - des.begin());

	root=new node();
	for(int i=1;i<=N;++i){
		ll tar=lb(ALL(des),A[i])-des.begin();
		pi x=root->ask(0,SZ(des)-1,0,tar);
		ll p=x.s;
		if(i==N){
			cout<<x.f+1;
			return 0;
		}
		ll xval=2*A[i]-A[p];
		ll pos=lb(ALL(des),xval)-des.begin();
		root->up(0,SZ(des)-1,pos, mp(x.f+1,i));
	}
}
#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...