CF div2E
  • 板块学术版
  • 楼主Miraik
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/27 00:38
  • 上次更新2023/10/23 20:21:06
查看原帖
CF div2E
236862
Miraik楼主2023/3/27 00:38

下大分,流泪了。WA4 求调/hack。

#include<bits/stdc++.h>
using namespace std;
const int N=300005;
const int inf=1000000005;
inline int read(){
	int x=0,f=1; char c=getchar();
	while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
	while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*f;
}	int n,a[N],to[N],top[N],len[N],mxlen[N],g[N],ans[N];
inline void solve(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read(),g[i]=-inf;
	len[n+1]=mxlen[n+1]=0; top[n+1]=n+1;
	for(int i=n;i;i--){
		to[i]=i+a[i]+1;
		if(to[i]<=n+1) len[i]=len[to[i]]+1,top[i]=top[to[i]];
		else len[i]=0,top[i]=i;
		if(top[i+1]==n+1&&len[i+1]==a[i]) ans[i]=0;
		else if(top[i+1]==n+1) ans[i]=1;
		else if(len[i+1]+g[top[i+1]]+1>=a[i]) ans[i]=1;
		else ans[i]=2;
		mxlen[i]=mxlen[i+1];
		if(top[i]!=n+1)
			g[top[i]]=max(g[top[i]],-len[i]+mxlen[i+1]);
		else
			mxlen[i]=max(mxlen[i],len[i]);
//		cerr << i << ' ' << top[i] << ' ' << len[i] << '\n';
	}
	for(int i=1;i<n;i++) printf("%d%c",ans[i],i==n-1?'\n':' ');
}
int main(){
	int tc=read();
	while(tc--) solve();
	return 0;
}
2023/3/27 00:38
加载中...