제출 #1337129

#제출 시각아이디문제언어결과실행 시간메모리
1337129joacruRastuci (COCI25_rastuci)C++20
110 / 110
826 ms196588 KiB
#include <iostream>
#include <assert.h>
#include <algorithm>
#include <vector>

#define forn(i,n) for(int i=0;i<(int)n;++i)
#define forit(i,a,n) for(int i=a;i<=(int)n;++i)

#define DBG(a) cerr<<#a<<" = "<<(a)<<endl
#define DBGA(a) cerr<<#a<<" = "<<(a)<<", ";
#define DBG2(a,b) do{DBGA(a)DBG(b);}while(0)

#define ALL(v) v.begin(),v.end()
#define SZ(v) (int)v.size()

using namespace std;

template<typename T>
ostream &operator<<(ostream &os, vector<T> v){
	os<<"[";
	forn(i,SZ(v)){
		if(i) os<<", ";
		os<<v[i];
	}
	os<<"]";
	return os;
}

typedef long long ll;

const ll INF = 1000000000000000000;

struct ST{
	int n;
	vector<ll> st;
	ST(int m){
		n = 1<<(32-__builtin_clz(m-1));
		st.resize(2*n-1, INF);
	}
	int query(ll v){
		int i = 0;
		if(st[i]>v) return -1; // no hay valor valido
		while(i<n-1){
			if(st[2*i+2]<=v) i=2*i+2;
			else i=2*i+1; // porque primero me aseguro
		}
		return i-n+1;
	}
	void update(int i, ll v){
		i+=n-1;
		st[i] = v;
		while(i){
			i = (i-1)/2;
			st[i] = min(st[2*i+1],st[2*i+2]);
		}
	}
};

void solve(){
	int n;
	cin>>n;
	vector<int> a(n);
	for(int &x: a) cin>>x;
	vector<ll> add(n+1);
	forn(i,n) add[i+1] = add[i]+a[i];
	vector<vector<ll>> dp(n+1,vector<ll>(n+1,INF));
	forit(i,1,n) dp[1][i] = add[i]; // tablita aditiva fachera
	forit(i,2,n){
		ST rast(n+1);
		for(int j=1;j<=n;++j){
			int k = rast.query(-(add[n]-add[j]));
			if(k == -1){
				dp[i][j] = INF;
			} else{
				dp[i][j] = add[j]-add[k];
			}
			if(dp[i-1][j] != INF){
				rast.update(j,dp[i-1][j]-(add[n]-add[j]));
			}
		}
	}
	//~ forit(i,1,n){
		//~ forit(j,1,n){
			//~ if(dp[i][j] == INF) cerr<<"--\t";
			//~ else cerr<<dp[i][j]<<"\t";
		//~ }
		//~ cerr<<"\n";
	//~ }
	int ans = 0;
	forit(i,1,n) if(dp[i][n] != INF) ans = i;
	vector<ll> b;
	int i=ans, j=n;
	while(i){
		ll sum = dp[i][j];
		b.push_back(sum);
		while(j>=1&&sum>0){
			sum -= a[--j];
		}
		assert(!sum);
		--i;
	}
	reverse(ALL(b));
	cout<<ans<<"\n";
	for(ll x: b) cout<<x<<" ";
	cout<<"\n";
}

int main(){
	
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	#ifdef LOCAL
	freopen("D.in", "r", stdin);
	int tcs; cin>>tcs;
	while(tcs--)
	#endif
	solve();
	
	return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...