Pearls POJ - 1260 斜率dp

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5;
int val[N],sum[N],dp[N];
int q[N],r,l;
int getup(int r,int l) {
    return dp[r]-dp[l];
}
int getdown(int r,int l) {
    return sum[r]-sum[l];
}
int main() {
    int t;
    scanf("%d",&t);
    while(t--) {
        int n;
        scanf("%d", &n);
        sum[0]=0;
        for(int i=1; i<=n; i++)
            scanf("%d%d", &sum[i],&val[i]),sum[i]+=sum[i-1];
        l=r=0;
        q[0]=0;
        for(int i=1; i<=n; i++) {
            while(l<r && getup(q[l+1],q[l])<=val[i]*getdown(q[l+1],q[l]))
                l++;
            int j=q[l];
            dp[i]=dp[j]+(sum[i]-sum[j]+10)*val[i];
            while(l<r&&getup(i,q[r-1])*getdown(q[r],q[r-1])<=getup(q[r],q[r-1])*getdown(i,q[r-1]))
                r--;
            q[++r]=i;
        }
        printf("%d\n", dp[n]);
    }
}
posted @ 2020-03-18 17:44  晴屿  阅读(59)  评论(0编辑  收藏  举报