斜率优化练习2——P3628 [APIO2010]特别行动队

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Love_mona/article/details/79873723

蒟蒻的垂死挣扎


这题的水令人恐惧,甚至我因为初始队列里没有加0点困扰了许久。

真的不想写什么。。。

// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<cstring>
#include<algorithm>
#define ll long long
#define ls (now<<1)
#define rs ((now<<1)|1)
#define N 1000100
#define RG register
using namespace std;

inline ll read(){
    ll x=0,o=1;
    char ch=getchar();
    while((ch>'9'||ch<'0')&&ch!='-') ch=getchar();
    if(ch=='-') o=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*o;
}

ll n,a,b,c,Q[N];
struct mona { ll w,x,y,ans; } p[N];

inline double Slope(RG int k,RG int j) { return (1.0*(p[j].y-p[k].y))/(1.0*(p[j].x-p[k].x)); }

int main(){
    n=read(),a=read(),b=read(),c=read();
    for(RG int i=1;i<=n;++i){ RG int x=read();
        p[i]=(mona) { x,p[i-1].x+x,0,a*p[i].x*p[i].x+b*p[i].x+c };
    } RG int top=1,tail=1; Q[1]=0;
//	for(RG int i=1;i<=n;++i) cout<<p[i].w<<' '<<p[i].x<<endl;	
    for(RG int i=1;i<=n;++i){
        while(tail>top&&Slope(Q[top],Q[top+1])>2.0*a*p[i].x) ++top;
        p[i].ans=max(p[i].ans,p[Q[top]].y+a*p[i].x*p[i].x+b*p[i].x-2*a*p[i].x*p[Q[top]].x+c);
        p[i].y=p[i].ans+a*p[i].x*p[i].x-b*p[i].x;
        while(tail>top&&Slope(Q[tail-1],Q[tail])<=Slope(Q[tail-1],i)) --tail;
        Q[++tail]=i; //cout<<p[i].ans<<' ';
    }   cout<<p[n].ans;
}

猜你喜欢

转载自blog.csdn.net/Love_mona/article/details/79873723