啊啊啊啊一直WA求助
查看原帖
啊啊啊啊一直WA求助
160839
Prean楼主2020/7/20 21:52

输出发现每次队列大小都为1,是不是斜率那儿写错了/yiw

禁止无意义回复

#include<cstdio>
#include<cctype>
const int M=1e6+5;
typedef long long ll;
ll a,b,c,x,sum[M],dp[M];
int n,L=1,R,q[M];
inline double slope(int x,int y){
    return (dp[y]-dp[x]+a*(sum[y]*sum[y]-sum[x]*sum[x])-b*(sum[y]-sum[x]))/(sum[y]-sum[x]);
}
inline ll read(){
    ll n=0;char s;bool f=true;
    while(!isdigit(s=getchar()))if(s==45)f=false;
    while(n=n*10+(s^48),isdigit(s=getchar()));
    return f?n:-n;
}
signed main(){
    int i,j;
    n=read();a=read();b=read();c=read();
    for(i=1;i<=n;++i){
        sum[i]=read()+sum[i-1];
        while(L<=R&&slope(q[L],q[L+1])<=2.0*a*sum[i])++L;
        x=(sum[i]-sum[j=q[L]]);
        dp[i]=dp[j]+a*x*x+b*x+c;
        while(L<=R&&slope(q[R-1],q[R])>=slope(q[R],i))--R;
        q[++R]=i;
        // printf("%d %d %d %d\n",L,R,j,dp[i]);
        // for(j=L;j<=R;++j)printf("%d ",q[j]);
        // printf("\n");
    }
    printf("%lld",dp[n]);
}

队列马蜂,左开右开

2020/7/20 21:52
加载中...