WA on test 3求助!
  • 板块CF13E Holes
  • 楼主osfly
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/4/29 13:44
  • 上次更新2023/10/28 02:40:51
查看原帖
WA on test 3求助!
339299
osfly楼主2022/4/29 13:44
#include<cstdio>
#include<cmath>
#define int long long
int n,m;
int k[200010];
struct Block
{
	int len;
	int cnt;
	int l[200010],r[200010];
	int belong[200010];
	int v[200010];
	int s[200010];
	void build()
	{
		len=sqrt(n);
		cnt=n/len;
		if(n%len) cnt++;
		for(int i=1;i<=cnt;i++)
		{
			l[i]=(i-1)*len+1;
			r[i]=i*len;
		}
		r[cnt]=n;
		for(int i=1;i<=n;i++) belong[i]=(i-1)/len+1;
		for(int i=n;i>=1;i--)
		{
			v[i]=i+k[i];
			if(v[i]>r[belong[i]]) s[i]=1;
			else s[i]=s[v[i]]+1,v[i]=v[v[i]];
		}
	}
	void update(int j,int num)
	{
		k[j]=num;
		for(int i=r[belong[j]];i>=l[belong[j]];i--)
		{
			v[i]=i+k[i];
			if(v[i]>r[belong[i]]) s[i]=1;
			else s[i]=s[v[i]]+1,v[i]=v[v[i]];
		}
	}
	void query(int j)
	{
		int ans=0;
		int pre;
		while(j<=n) ans+=s[j],pre=j,j=v[j];
		printf("%lld %lld\n",pre,ans);
	}
}block;
signed main()
{
	scanf("%lld",&n);
	scanf("%lld",&m);
	for(int i=1;i<=n;i++) scanf("%lld",&k[i]);
	block.build();
	while(m--)
	{
		int op,x,y;
		scanf("%lld",&op);
		if(op==0)
		{
			scanf("%lld%lld",&x,&y);
			block.update(x,y);
		}
		else
		{
			scanf("%lld",&x);
			block.query(x);
		}
	}
	return 0;
}
2022/4/29 13:44
加载中...