Bindian_Signalizing题解

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,所以都正确。
我太弱了,别人都是一遍过,
像我这样的高二即将退役的弱鸡选手,怎么跟那些比我小还比我强,还比我努力的巨佬比啊!

posted @ 2019-10-14 22:00  lsoi_ljk123  阅读(133)  评论(0编辑  收藏  举报