[C++] 純文本查看 復制代碼
#include<cstdio>
#include<algorithm>
using namespace std;
int in[1000000];
int N;
typedef long long ll;
typedef pair<int,int> pll;
pll sq[2200000];
void modify(int i,int v,int L,int R,int id)
{
if(L==R){
sq[id]={v,i};
return ;
}
int M = (L+R)/2;
if(i<=M)modify(i,v,L,M,id*2);
else modify(i,v,M+1,R,id*2+1);
sq[id] = max(sq[id*2],sq[id*2+1]);
}
pll max(int l,int r,int L,int R,int id)
{
if(l<=L&&R<=r)
return sq[id];
if(r<L||R<l)
return {0,0};
int M = (L+R)/2;
return max( max(l,r,L,M,id*2),max(l,r,M+1,R,id*2+1) );
}
#define rmq 0,N-1,1
ll solve(int L,int R)
{
if(L==R)return 0;
if(L+1==R){
return max(in[L],in[R]);
}
ll cost = 0;
pll mv = max(L,R,rmq);
ll mid = mv.second;
ll val = mv.first;
if( L < mid )
{
cost+=solve(L,mid-1);
cost+=val;
}
if( mid < R )
{
cost+=solve(mid+1,R);
cost+=val;
}
return cost;
}
int main()
{
ll sum=0;
bool inc = true;
bool dec = true;
scanf("%d",&N);
for(int i=0;i<N;++i)
{
scanf("%d",&in[i]);
modify(i,in[i],rmq);
sum+=in[i];
if(i){
if(in[i-1]<in[i])dec=false;
if(in[i-1]>in[i])inc=false;
}
}
if(!inc && !dec)
printf("%lld\n",solve(0,N-1));
else
printf("%lld\n",sum-*min_element(in,in+N));
}