Codeforces Round #127 (Div. 1), problem: (C) Fragile Bridges 优先队列

题意:这个人的运动方式类似于77C - Beavermuncher-0xFF 求最后最多可以走过的点。

做法:假设一个人最后回到j,最多可以走过的点,可以先求出i-0-i,i-n-i,最多可以走过的点数,这个可以用直接贪心,设在把i-n之间的桥都走塌陷的情况下可以做过最多的点

还可以求出0-i(不经过两点范围之外的点)最多可以做过的点 sum[i]。

然后dp[j]=sum[j]-sum[i]+left[j]+right[i]=sum[j]+left[j]+left[i]-sum[i],这个可以用单调队列记录

这种题目首先要暴力枚举出发点和终点,然后在判断走回路和不走回路的情况。这里的运动是可以归类的,千万不要被一开始看似无需的情况搞晕啊》。。。

#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#define LL long long
const int LMT=100005;
using namespace std;
LL lef[LMT],rig[LMT],sum[LMT],bri[LMT];
struct  comp
 {
         bool operator()(const int i, const int j)
         {
             return lef[i]-sum[i]<lef[j]-sum[j];
         }
 };
 priority_queue<int,vector<int>,comp> que;
 int main(void)
 {
     int n;LL ans=0;
     scanf("%d",&n);
     for(int i=1;i<n;i++)
     {
         scanf("%I64d",&bri[i]);
         if(bri[i]>=2)lef[i]+=lef[i-1];
         lef[i]+=bri[i]&1?bri[i]-1:bri[i];
         sum[i]+=sum[i-1]+(bri[i]&1?bri[i]:bri[i]-1);
     }
     for(int i=n-1;i>=0;i--)
     {
         rig[i]+=bri[i+1]&1?bri[i+1]-1:bri[i+1];
         if(bri[i+1]>=2)rig[i]+=rig[i+1];//靠!!
     }
     for(int i=0;i<n;i++)
     {
            que.push(i);
         ans=max(ans,lef[que.top()]-sum[que.top()]+sum[i]+rig[i]);
     }
     printf("%I64d\n",ans);
     return 0;
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值