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