Submission #1323805

#TimeUsernameProblemLanguageResultExecution timeMemory
1323805boclobanchatDischarging (NOI20_discharging)C++20
100 / 100
94 ms30704 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
const long long INF=1e18;
long long dp[MAXN],A[MAXN],P[MAXN];
double range[MAXN];
stack<int> st;
pair<long long,long long> line[MAXN];
double intersect(pair<long long,long long> a,pair<long long,long long> b)
{
	return (double)(b.second-a.second)/(a.first-b.first);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,cnt=0,mx=0,pre=0;
    cin>>n;
    range[0]=-INF,range[1]=INF;
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
    	cin>>A[i];
    	if(mx<A[i])
		{
			mx=A[i];
	    	dp[i]=INF,line[i]={n-i+1,dp[pre]};
	    	while(!st.empty()&&intersect(line[i],line[st.top()])<range[cnt]) st.pop(),cnt--;
	    	if(!st.empty()) range[++cnt]=intersect(line[i],line[st.top()]),range[cnt+1]=INF;
	    	st.push(P[cnt]=i);
	    	int pos=upper_bound(range,range+cnt+1,A[i])-range-1;
	    	ans=dp[i]=min(dp[i],line[P[pos]].first*A[i]+line[P[pos]].second),pre=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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...