ダ月 @ 2024-08-17 18:41:48
以前缀为例,我们依次枚举
我通过了本题,问这做法复杂度是否正确。
int n;std::cin>>n;
ve<int>v(n+1);
for(int i=1;i<=n;i++)
std::cin>>v[i];
bool flg=true;
for(int i=1;i<=n;i++)
if(v[i]!=i){
flg=false;
break;
}
if(flg)return std::cout<<n-1<<'\n',void();
int ans=0;
int mn=1e9,mx=0,d=0;
ve<int>pre(n+1),suf(n+1);
ve<int>vis(n+1);
for(int i=1;i<=n;i++){
mx=std::max(mx,v[i]);
mn=std::min(mn,v[i]);
vis[v[i]]=true;
if(i>1&&(mx-mn)%(i-1)==0){
int d=(mx-mn)/(i-1);
if(d==1){pre[i]=true;continue;}
bool flg=true;
for(int k=mn;k<=mx;k+=d)
if(!vis[k]){
flg=false;
break;
}
pre[i]=flg;
}else if(i==1)pre[i]=true;
}mn=1e9,mx=0;
for(int i=1;i<=n;i++)vis[i]=0;
for(int i=n;i>=1;i--){
mx=std::max(mx,v[i]);
mn=std::min(mn,v[i]);
vis[v[i]]=true;
if(i<n&&(mx-mn)%(n-i)==0){
int d=(mx-mn)/(n-i);
if(d==1){suf[i]=true;continue;}
bool flg=true;
for(int k=mn;k<=mx;k+=d)
if(!vis[k]){
flg=false;
break;
}
suf[i]=flg;
}else if(i==n)suf[i]=true;
}
for(int i=1;i<n;i++)
ans+=pre[i]&&suf[i+1];
std::cout<<ans<<'\n';
by Nt_Tsumiki @ 2024-08-17 18:44:36
@ダ月 感觉不太对吧应该是可以卡成
by Nt_Tsumiki @ 2024-08-17 18:46:54
前奇后偶的一个就好像可以
by _H17_ @ 2024-08-17 18:55:42
@ダ月 公差只能是1,2
by GI录像机 @ 2024-08-17 18:56:09
2 4 6 8 10 12 这样好像就卡掉了
by _H17_ @ 2024-08-17 18:57:24
@GI录像机 1-n的排列吧哥们
by Nt_Tsumiki @ 2024-08-17 18:57:46
@GI录像机 但是排列啊
by min_inf @ 2024-08-17 19:07:48
哦好像是不太对,d=2就爆了
by GI录像机 @ 2024-08-17 19:27:13
@Nt_Tsumiki 你不能后面随便填上吗
也就是
@H17
by _H17_ @ 2024-08-17 19:31:25
@GI录像机 哦,对不起误解了
by ダ月 @ 2024-08-17 19:36:06
不清楚,反正是稀里糊涂地过了/yun