码迷,mamicode.com
首页 > 其他好文 > 详细

CF957D Riverside Curio

时间:2019-07-13 09:30:54      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:long   scanf   span   mes   bit   clu   ace   记录   sid   

dp+预处理

dp[i]表示第i天时的水位线有多少条,

然后你会发现这个dp是有后效性的,当第i天的m[i]>dp[i-1]时就要修改之前的dp值

因此我们预处理出每一天的至少要多少条水位线,记l[i]为多少条水位线

所以每天至少需要m[i]+1条水位线,然后我们从后往前枚举,记录now表示从后推出当前的i需要的水位线

l[i]=max(now,m[i]+1)

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
ll n,m[100011],dp[100011];
ll l[100011];
int main()
{
    scanf("%lld",&n);
    for (int i=1;i<=n;i++)
      scanf("%lld",&m[i]);
    ll now;
    now=m[n]+1;
    for (int i=n;i>=1;i--)
    {
        now--;
        now=max(now,m[i]+1);
        l[i]=now;//同上
    }
    dp[1]=1;//第一天肯定有一条水位线
    for (int i=2;i<=n;i++)
    {
        dp[i]=dp[i-1];
        dp[i]=max(dp[i],m[i]+1);
        dp[i]=max(dp[i],l[i]);
    }
    ll ans=0;
    for (int i=1;i<=n;i++)
      ans+=dp[i]-1-m[i];//统计水位之下的水位线
    printf("%lld\n",ans);
}

 

CF957D Riverside Curio

标签:long   scanf   span   mes   bit   clu   ace   记录   sid   

原文地址:https://www.cnblogs.com/huangchenyan/p/11179328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!