首页 > 其他 > 详细

Bindian_Signalizing题解

时间:2019-10-14 22:21:12      阅读:74      评论:0      收藏:0      [点我收藏+]

Bindian_Signalizing题解

\(O(n)\)做法有点恶心,
将环变链的操作我为什么没想到,咕咕咕。
首先将环变链,以最高的为第一个,所有有贡献的就在\(1~n+1\)之间
然后我们处理出每个点可以拓展的区间(小于等于它),那么每个点可以对与它相等的点和区间两边的点做贡献,
但注意,当两边是同一个点,即都是最高点(l=1 && r=n+1)时,要减去1的贡献,

但我还是锅了!!!

错误代码:

for(re int i=2;i<=n;++i){
        ans+=num[i];
        if(h[1]>h[i]){
           ans+=2ll;
           if(l[i]==1&&r[i]==n+1) --ans;
        }
    }

正确的应该是:

for(re int i=1;i<=n;++i){
        ans+=num[i];
        if(h[1]>h[i]){
           ans+=2ll;
           if(l[i]==1&&r[i]==n+1) --ans;
        }
    }

或者

for(re int i=2;i<=n;++i){
        ans+=num[i]+2ll;
         if(l[i]==1&&r[i]==n+1) --ans;
}

想了好久才知道为什么错了,主要是没有加上等于\(h[1]\)的山的高度,
这两种正解,第一种加了\(num[1]\),第二种在所有\(h[i]=h[1](i!=1)\)时加了2-1=1,所以都正确。
我太弱了,别人都是一遍过,
像我这样的高二即将退役的弱鸡选手,怎么跟那些比我小还比我强,还比我努力的巨佬比啊!

Bindian_Signalizing题解

原文:https://www.cnblogs.com/ljk123-de-bo-ke/p/11674492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!