题目是CF1032G,在洛谷ide、本地 Linux和windows 都没事,但交上去就会 CE
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define pii pair<int,int>
#define fr first
#define sc second
#define mk make_pair
#define inx int i=h[u],v=edge[i].v,w=edge[i].w;~i;i=edge[i].nx,v=~i?edge[i].v:0,w=~i?edge[i].w:0
#define x1 x114514
#define y1 y114514
const int MAXN=300010,N=19,ie9=1000000000,Mod=998244353;
int n,a[MAXN],lg[MAXN],ans;
struct STB{
pii f[N+1][MAXN],g[N+1][MAXN];
void build(){
for(int i=1;i<=n*3;i++){
f[0][i]=mk(min(3*n,i+a[i]),i);
g[0][i]=mk(max(1ll,i-a[i]),i);
}
for(int i=1;i<=N;i++){
for(int j=1;j<=n*3-(1<<i)+1;j++){
f[i][j]=max(f[i-1][j],f[i-1][j+(1<<i-1)]);
}
for(int j=1;j<=n*3-(1<<i)+1;j++){
g[i][j]=min(g[i-1][j],g[i-1][j+(1<<i-1)]);
}
}
}
pii query(int l,int r){
int tmp=lg[r-l+1];
return mk(min(g[tmp][l],g[tmp][r-(1<<tmp)+1]).sc,max(f[tmp][l],f[tmp][r-(1<<tmp)+1]).sc);
}
}stb;
pii f[N][MAXN];
void slv(){
scanf("%lld",&n);
for(int i=2;i<=300000;i++)lg[i]=lg[i>>1]+1;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i+n]=a[i];
a[i+2*n]=a[i];
}
for(int i=1;i<=3*n;i++)f[0][i]=mk(max(1ll,i-a[i]),min(3*n,i+a[i]));
stb.build();
for(int i=1;i<=N;i++){
for(int j=1;j<=n*3;j++){
pii tmp=stb.query(f[i-1][j].fr,f[i-1][j].sc);
f[i][j].fr=min(f[i-1][tmp.fr].fr,f[i-1][tmp.sc].fr);
f[i][j].sc=max(f[i-1][tmp.fr].sc,f[i-1][tmp.sc].sc);
}
}
for(int i=n+1;i<=2*n;i++){
int cnt=0,l=i,r=i;
for(int j=N;~j;j--){
pii tmp=stb.query(l,r);
l=tmp.fr,r=tmp.sc;
int L=min(f[j][l].fr,f[j][r].fr),R=max(f[j][r].sc,f[j][l].sc);
if(R-L+1>=n)continue;
l=L;r=R;cnt+=1<<j;
}
printf("%lld ",cnt+1);
}
}
signed main(){
slv();
return 0;
}