103272024-03-30 22:48:51111Majomházcpp17Hibás válasz 40/1001.149s26328 KiB
// Lagrangian Relaxation & Li Chao Tree

#include <bits/stdc++.h>
using namespace std;

#define int long long

#define INF (int)1e18

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,K;
	cin>>N>>K;
	vector<int>v(N+1),pf(N+1);
	for(int i=0;i<N;i++){
		cin>>v[i];
		pf[i+1]=pf[i]+v[i];
	}
	auto solve=[&](int y)->pair<int,int>{
		vector<int>dp(N+1,INF),cnt(N+1),t((N+1)*4);
		auto cost=[&](int s,int e)->int{
			return dp[s]+(pf[e]-pf[s])*(e-s);
		};
		auto add=[&](int i,int l,int r,int p)->void{
			while(true){
				int m=(l+r)/2;
				bool ll=cost(p,l)<cost(t[i],l);
				bool mm=cost(p,m)<cost(t[i],m);
				if(mm){
					swap(t[i],p);
				}
				if(l==r){
					break;
				}
				if(ll!=mm){
					i=i*2+1;
					r=m;
				}
				else{
					i=i*2+2;
					l=m+1;
				}
			}
		};
		auto get=[&](int i,int l,int r,int x)->int{
			int bc=INF,bi=0;
			while(true){
				int m=(l+r)/2;
				int c=cost(t[i],x);
				if(c<bc){
					bc=c;
					bi=t[i];
				}
				if(l==r){
					break;
				}
				if(x<m){
					i=i*2+1;
					r=m;
				}
				else{
					i=i*2+2;
					l=m+1;
				}
			}
			return bi;
		};
		dp[0]=-y;
		cnt[0]=-1;
		add(0,0,N,0);
		for(int i=1;i<=N;i++){
			int o=get(0,0,N,i);
			dp[i]=cost(o,i)+y;
			cnt[i]=cnt[o]+1;
			add(0,0,N,i);
		}
		return{dp[N],cnt[N]};
	};
	int l=0,h=1e12;
	while(l<h){
		int m=(l+h)/2;
		auto [x,c]=solve(m);
		if(c<=K){
			h=m;
		}
		else{
			l=m+1;
		}
	}
	auto [x,c]=solve(h);
	cout<<x-c*h<<'\n';
	return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms1824 KiB
2Elfogadva46ms2920 KiB
subtask210/10
3Elfogadva3ms2332 KiB
4Elfogadva3ms2504 KiB
5Elfogadva3ms2544 KiB
6Elfogadva3ms2628 KiB
7Elfogadva3ms2848 KiB
subtask310/10
8Elfogadva6ms2868 KiB
9Elfogadva6ms3136 KiB
10Elfogadva6ms3464 KiB
11Elfogadva6ms3316 KiB
12Elfogadva6ms3380 KiB
subtask420/20
13Elfogadva46ms3984 KiB
14Elfogadva48ms4016 KiB
15Elfogadva50ms4056 KiB
16Elfogadva54ms4096 KiB
17Elfogadva54ms4128 KiB
18Elfogadva52ms4288 KiB
subtask50/29
19Hibás válasz519ms10244 KiB
20Hibás válasz522ms10456 KiB
21Elfogadva538ms10924 KiB
22Elfogadva532ms11376 KiB
23Elfogadva550ms11652 KiB
subtask60/31
24Hibás válasz1.08s18536 KiB
25Hibás válasz1.09s19296 KiB
26Hibás válasz1.074s20040 KiB
27Hibás válasz1.088s20572 KiB
28Hibás válasz1.083s21236 KiB
29Hibás válasz1.082s22008 KiB
30Hibás válasz1.082s22576 KiB
31Hibás válasz1.083s23640 KiB
32Hibás válasz1.085s24196 KiB
33Elfogadva1.087s24880 KiB
34Elfogadva1.128s25520 KiB
35Elfogadva1.139s25648 KiB
36Elfogadva1.146s25896 KiB
37Elfogadva1.149s25896 KiB
38Elfogadva1.149s25900 KiB
39Elfogadva1.118s26112 KiB
40Elfogadva1.09s26328 KiB