为什么样例是180,枯了
查看原帖
为什么样例是180,枯了
291604
王茗仟楼主2022/10/1 07:45
const int MAXN=3e5;
using namespace std;
int t[MAXN],f[MAXN],sumt[MAXN],sumf[MAXN];
int q[MAXN],l,r;
int dp[MAXN];
int n,s;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
    return x*f;
}

int binary_search(int i,int k){
    if(l==r) return q[l];
    int L=1,R=r;
    while(L<R){
        int mid=(L+R)>>1;
        if(dp[q[mid+1]]-dp[q[mid]]<=k*(sumf[q[mid+1]])-sumf[q[mid]])
        L=mid+1;
        else 
        R=mid;
    }
    return q[l];
}

int main(){
    n=read();s=read();
    for(int i=1;i<=n;i++){
        t[i]=read();f[i]=read();
        sumt[i]=sumt[i-1]+t[i];
        sumf[i]=sumf[i-1]+f[i];
    }
    memset(dp,0x3f3f3f3f,sizeof(dp));
    dp[0]=0;
    l=1,r=1;
    q[1]=0;
    for(int i=1;i<=n;i++){
        int p=binary_search(i, s+sumt[i]);
        dp[i]=dp[p]+s*sumf[n]+sumt[i]*sumf[i]-sumf[p]*(sumt[i]+s);
        while(l<r&&(dp[q[r]]-dp[q[r-1]])*(sumf[i]-sumf[q[r]])>(dp[i]-dp[q[r]])*(sumf[q[r]]-sumf[q[r-1]]))r--;
        q[++r]=i;
    }
    cout<<dp[n]<<endl;
    return 0;
}
2022/10/1 07:45
加载中...