제출 #1118046

#제출 시각아이디문제언어결과실행 시간메모리
1118046urosk수열 (APIO14_sequence)C++14
11 / 100
2083 ms35916 KiB
    #define here cerr<<"===========================================\n"
    #define dbg(x) cerr<<#x<<": "<<x<<endl;
    #include <bits/stdc++.h>
    #define llinf 100000000000000000LL // 10^17
    #define iinf 2000000000 // 2*10^9
    #define pb push_back
    #define eb emplace_back
    #define popb pop_back
    #define fi first
    #define sc second
    #define endl '\n'
    #define all(a) a.begin(),a.end()
    #define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;}
    #define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;}
    #define si(a) (ll)(a.size())
    using namespace std;
    using ld = double;
    using ll = long long;
    using ull = unsigned long long;
    using pii = pair<int,int>;
    using pll = pair<ll,ll>;
    using pld = pair<ld,ld>;
     
    #define mod 1
    ll add(ll x,ll y){
    	x+=y;
    	if(x<0){
    		x%=mod;
    		x+=mod;
    	}else{
    		if(x>=mod) x%=mod;
    	}
    	return x;
    }
    ll mul(ll a,ll b){
    	a = add(a,0);
    	b = add(b,0);
    	ll ans = (a*b)%mod;
    	if(ans<0) ans+=mod;
    	return ans;
    }
     
     
    const ll maxn = 100005;
    const ll maxk = 205;
    const ll maxx = 1000005;
    const ll mx = 1000000000;
    ll n,k;
    ll a[maxn];
    ll ps[maxn];
    ll dp[maxk][maxn];
    int opt[maxk][maxn];
    struct lin {
    	ll n,k;
    	lin(){n = -llinf,k = 0;}
    	lin(ll n_,ll k_){n = n_,k = k_;}
    	ll operator()(ll x){return k*x+n;}
    };
    pair<ll,lin> t[maxx];
    ll ls[maxx],rs[maxx],tsz = 0,root = 0;
    void upd(ll &v,ll tl,ll tr,pair<ll,lin> p) {
    	if(!v) v = ++tsz;
    	if(t[v].sc.n==-llinf){t[v] = p;return;}
    	ll mid = tl+(tr-tl)/2;
    	if(t[v].sc(mid)<p.sc(mid)) {
    		swap(t[v],p);
    	}
    	lin g = t[v].sc;
    	if(g(tl)>=p.sc(tl)) {
    		upd(rs[v],mid+1,tr,p);
    	}else {
    		upd(ls[v],tl,mid,p);
    	}
    }
    pair<ll,ll> get(ll &v,ll tl,ll tr,ll i) {
    	if(!v) return {-llinf,0};
    	cerr<<t[v].sc(i)<<endl;
    	if(tl==tr){return {t[v].sc(i),t[v].fi};}
    	ll mid = tl+(tr-tl)/2;
    	pll val = {t[v].sc(i),t[v].fi};
    	if(i<=mid) return max(val,get(ls[v],tl,mid,i));
    	return max(val,get(rs[v],mid+1,tr,i));
    }
    void tc(){
    	pair<ll,lin> pp;
    	pp.fi = 0;
    	pp.sc = lin();
    	for(ll i = 0;i<maxx;i++) t[i] = pp;
    	cin >> n >> k;
    	for(ll i = 1;i<=n;i++) cin >> a[i];
    	for(ll i = 1;i<=n;i++) ps[i] = ps[i-1] + a[i];
    	for(ll j = 1;j<=k;j++) {
          	for(ll i = 1;i<=n;i++){
              lin f(-ps[i]*ps[i]+dp[j-1][i],ps[i]);
              upd(root,-mx,mx,{i,f});
            }
    		for(ll i = 1;i<=n;i++) {
    			auto it = get(root,-mx,mx,ps[i]);
    			dp[j][i] = it.fi;
    			opt[j][i] = it.sc;
    
    		}
    		for(ll i = 0;i<=tsz;i++) {
    			t[i] = pp;
    			ls[i] = rs[i] = 0;
    		}
    		root = tsz = 0;
    	}
    	cout<<dp[k][n]<<endl;
    	vector<ll> v;
    	for(ll i = k;i>=1;i--) {
    		n = opt[i][n];
    		v.pb(n);
    	}
    	reverse(all(v));
    	for(ll x : v) cout<<x<< " ";
    	cout<<endl;
    }
     
    int main(){
    	ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0);
    	int t; t = 1;
    	while(t--){
    		tc();
    	}
    	return (0-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...