分块70ptsTLE求优化或卡常
查看原帖
分块70ptsTLE求优化或卡常
324226
X2H_tato楼主2024/7/4 15:19
#include <bits/stdc++.h>
using namespace std;
int a[300005],jump[300005],cnt[300005],now[300005];
int block;
int main()
{
	int n;
	scanf("%d",&n);
	block=sqrt(n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=200000;i++) now[i]=2e9;
	now[0]=0;
	for(int i=1;i<=n;i++)
		now[i]=(i-1)/block+1;
	for(int i=1;i<=n;i++)
	{
		int u=i,step=0;
		while(now[u]<now[i]+1)
		{
			//cout<<i;
			step++;
			u=a[u]+u;
		//	cout<<1;
		}
		jump[i]=u;
		cnt[i]=step;
	}
	int m;
	scanf("%d",&m);
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int k;
			scanf("%d",&k);
			k++;
			int s=0;
			for(int i=k;;)//奇怪的马蜂
			{
				s+=cnt[i];
				i=jump[i];
				if(i>n) break;
			}
			printf("%d\n",s);
		}
		if(op==2)
		{
			int j,k;
			scanf("%d%d",&j,&k);
			j++;
			a[j]=k;
			for(int i=j;;i--)
			{
				int u=i,step=0;
				while(now[u]<now[i]+1)
				{
					step++;
					u=a[u]+u;
				}
				jump[i]=u;
				cnt[i]=step;
				if(now[i]!=now[i-1]) break;				
			}
		}
		
	}
	return 0;
}
2024/7/4 15:19
加载中...