一句话:我看错考试时间了,我以为11:30结束,T2T3暴力没来得及交。
为什么考试的时间忽然变了啊。。。没转过来
一定要看清考试的起止时间!
虽说T2T3连爆搜都没打,只打特殊性质只有32分。爆搜分还挺高的。
当特殊性质不好扩展时,记得把爆搜打上。
本来是想T1先送上暴力,然后尝试肝T2,然后是T3暴力,有时间再回来优化T1。
但是整场考试时间是崩的,也没回T1。。。然而T2T3
注意分数与时间的权衡。
T1:Reverse
BFS。
二营长打法极其简单。因为是BFS所以一个点不会被多次更新。
那么一次更新了一个区间内的全部奇数或偶数,下次遇到的时候直接跳过就行了。
用链表实现,代码特别特别特别简单。常数也特别小,复杂度O(n),相较于线段树优化建边还少个log。
1 #include<iostream> 2 using namespace std; 3 int dt[100005],q[100005],R[100005],n,m,k,S,x; 4 int main(){ 5 cin>>n>>k>>m>>S; 6 for(int i=1;i<=n;++i)dt[i]=n+1,R[i]=i+2; 7 while(m--)cin>>x,dt[x]=-1; 8 dt[S]=0;q[1]=S; 9 for(int h=1,t=1;h<=t;++h){ 10 int st=max(1,q[h]-k+1),l=st+st+k-1-q[h];st=min(n-k+1,q[h]);int r=st+st+k-1-q[h]; 11 for(int i=l;i<=r;i=R[i])if(dt[i]>dt[q[h]]+1)dt[i]=dt[q[h]]+1,q[++t]=i; 12 for(int i=l;i<=r;){int rr=R[i];R[i]=max(R[i],r);i=rr;} 13 } 14 for(int i=1;i<=n;++i)cout<<(dt[i]>n?-1:dt[i])<<" ";cout<<endl; 15 }