锰锌求助
  • 板块CF13E Holes
  • 楼主Lucifero
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/7/17 11:20
  • 上次更新2023/11/4 14:31:36
查看原帖
锰锌求助
335094
Lucifero楼主2021/7/17 11:20

rt,可以参考 这个

#include <bits/stdc++.h>
#define N 100000
#define KP 317
using namespace std;
class SqrtDec
{
public:
	int l,r;
}block[KP+1];
int a[N+1],bi[N*2+1],cnt[N*2+1],pos[N*2+1],n,kp;
void bbuild()
{
	int i;
	for(i=1;i<=kp;i++)
	{
		block[i].l=(i-1)*kp+1;
		block[i].r=i*kp;
	}
	block[kp].r=n;
}
void bset(int x,int k)
{
	int xi=bi[x],i;
	a[x]=k;
	for(i=x;bi[i]==xi;i--)
		if (bi[i]==bi[i+a[i]])
			cnt[i]=cnt[i+a[i]]+1,pos[i]=pos[i+a[i]];
		else cnt[i]=1,pos[i]=i+a[i];
}
pair<int,int> bcnt(int x)
{
	int res(0),i=x,pre=0;
	while(i<=n) res+=cnt[i],pre=i,i=pos[i];
	return make_pair(pre,res);
}
int main()
{
	//[CF13E]Holes
	int m,opt,x,k,i;
	scanf("%d%d",&n,&m);
	kp=ceil(sqrt(n));
	bbuild();
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		bi[i]=(i-1)/kp+1;
	}
	for(i=n;i>=1;i--)
		if (bi[i]==bi[i+a[i]])
			cnt[i]=cnt[i+a[i]]+1,pos[i]=pos[i+a[i]];
		else cnt[i]=1,pos[i]=i+a[i];
	while(m--)
	{
		scanf("%d%d",&opt,&x);
		if (opt==0)
		{
			scanf("%d",&k);
			bset(x,k);
		}
		else if (opt==1)
		{
			pair<int,int> ans=bcnt(x);
			printf("%d %d\n",ans.first,ans.second);
		}
	}
}
2021/7/17 11:20
加载中...