CF2018B Speedbreaker 题解
Super_Cube · · 题解
Solution
题意:初始区间为
贪心地想,每次肯定是往还没被扩展到且
结论:若有解则答案必定为
证明?首先不在交集内的点一定会存在至少一个城市无法到达。假设交集为
判断无解的条件为
Code
#include<bits/stdc++.h>
int l[200005],r[200005];
int T,n,L,R,ans;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
L=0;R=n+1;
for(int i=1;i<=n;++i)l[i]=0xfffff,r[i]=0;
for(int i=1,x;i<=n;++i){
scanf("%d",&x);
L=std::max(L,std::max(1,i-x+1));
R=std::min(R,std::min(i+x-1,n));
if(l[x]==0xfffff)l[x]=i;r[x]=i;
}
for(int i=2;i<=n;++i)
l[i]=std::min(l[i],l[i-1]),r[i]=std::max(r[i],r[i-1]);
ans=0;
for(int i=1;i<=n;++i)
if(l[i]&&r[i]-l[i]+1>i)ans=-1,i=n;
if(~ans)ans=R-L+1;
if(ans<0)ans=0;
printf("%d\n",ans);
}
return 0;
}