[BZOJ4658]rescue

来源:互联网 发布:安卓 网络加速器 编辑:程序博客网 时间:2024/05/16 08:58

傻傻的NBC好久没更博啦.
似乎荒废了.
要这博客何用..


好吧好吧切入正题

f[x] 表示(最后读的一页是(第x个感兴趣的页)时拯救的最多脑细胞数量)
方便起见令T[0]=K,T[N+1]=M,B[0]=B[N+1]=0
最终答案是f[N+1]

f[x]=maxx1i=0f[i]+ceil((T[x]T[i])/D)A

于是得到了O(N2)的算法

#include <cstdio>long long f[100002];int K, M, D, A, N, T[100002], B[100002];inline long long max(long long x, long long y){    return x > y ? x : y;}int main(){    scanf("%d%d%d%d%d", &K, &M, &D, &A, &N);    T[0] = K, T[N + 1] = M;    for (int i = 1; i <= N; i++)        scanf("%d%d", T + i, B + i);    for (int i = 1; i <= N + 1; i++)    {        f[i] = -1ll << 62;        for (int j = 0; j < i; j++)            f[i] = max(f[i], f[j] - (T[i] - T[j] + D - 1) / D * A);        f[i] += B[i];    }    printf("%lld\n", f[N + 1]);    return 0;}

现在睁大你可爱的小眼睛盯着这个可爱的DP方程30秒

f[x]=maxx1i=0f[i]+ceil((T[x]T[i])/D)A

ceil((T[x]T[i])/D)变成什么比较好呢…

ceil((T[x]T[i])/D)=T[x]/DT[i]/D+[T[x] mod D>T[i] mod D]

原DP方程biu~~一下变成了

f[x]=max(max0<=i<xT[i] mod D<T[x] mod D(f[i]+T[i]/DAA),max0<=i<xT[i] mod D>=T[x] mod D(f[i]+T[i]/DA))T[x]/DA

// 其中除号是整除,请委屈地捏着鼻子看完

对着T[i] mod D建出线段树,每次在线段树的T[i] mod D位置插入f[i]+T[i]/DA

啊好简单,为什么要写那么简单的题的题解呢

因为我只会做简单题呀

0 0
原创粉丝点击