Submission #1313033

#TimeUsernameProblemLanguageResultExecution timeMemory
1313033boclobanchatK blocks (IZhO14_blocks)C++20
53 / 100
1096 ms3448 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
const int INF=1e9;
int seg[MAXN*4],A[MAXN],dp[MAXN],L[MAXN],R[MAXN],pre[MAXN];
stack<int> st;
void build(int l,int r,int pos)
{
	if(l==r)
	{
		seg[pos]=INF;
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,pos*2);
	build(mid+1,r,pos*2+1);
	seg[pos]=INF;
}
void update(int l,int r,int i,int val,int pos)
{
	if(i<l||r<i) return ;
	if(l==r)
	{
		seg[pos]=val;
		return ;
	}
	int mid=(l+r)/2;
	update(l,mid,i,val,pos*2);
	update(mid+1,r,i,val,pos*2+1);
	seg[pos]=min(seg[pos*2],seg[pos*2+1]);
}
int get(int l,int r,int u,int v,int pos)
{
	if(u<=l&&r<=v) return seg[pos];
	int mid=(l+r)/2;
	if(v<=mid) return get(l,mid,u,v,pos*2);
	if(mid+1<=u) return get(mid+1,r,u,v,pos*2+1);
	return min(get(l,mid,u,v,pos*2),get(mid+1,r,u,v,pos*2+1));
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>A[i];
	for(int i=1;i<=n;i++)
	{
		while(!st.empty()&&A[i]>A[st.top()]) st.pop();
		if(st.empty()) L[i]=1;
		else L[i]=st.top()+1;
		st.push(i);
	}
	while(!st.empty()) st.pop();
	for(int i=n;i;i--)
	{
		while(!st.empty()&&A[i]>=A[st.top()]) st.pop();
		if(st.empty()) R[i]=n;
		else R[i]=st.top()-1;
		st.push(i);
	}
	for(int i=1;i<=n;i++) pre[i]=INF;
	for(int i=1;i<=k;i++)
	{
		build(0,n,1);
		dp[0]=INF;
		for(int j=1;j<=n;j++)
		{
			update(0,n,R[j-1],min(pre[j-1],get(0,n,R[j-1],R[j-1],1)),1);
			dp[j]=get(0,n,L[j]-1,n,1)+A[j];
		}
		for(int j=0;j<=n;j++) pre[j]=dp[j];
	}
	int ans=INF;
	for(int i=1;i<=n;i++) if(R[i]==n) ans=min(ans,dp[i]);
	cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...