分块 TLE on #13 求助
  • 板块CF13E Holes
  • 楼主seanlsy
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/6/9 20:58
  • 上次更新2023/10/27 23:39:37
查看原帖
分块 TLE on #13 求助
674247
seanlsy楼主2022/6/9 20:58

这玩意常数真的好大。

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0;bool f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=0;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return f?x:-x;
}
inline void out(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) out(x/10);
	putchar(x%10|48);
}
int n,m,block,a[100005],bl[100005],f[100005],g[100005],I,J,K;
void add(int pos,int x){
	a[pos]=x;
	for(int i=min(n,bl[pos]*block);i>(bl[pos]-1)*block;i--)
		if(i+a[i]<=min(bl[i]*block,n))
			f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
		else
			f[i]=1,g[i]=i+a[i];
}
int main(){
	n=read(),m=read();
	block=sqrt(n);
	for(int i=1;i<=n;i++)
		a[i]=read(),bl[i]=(i-1)/block+1;
	for(int i=n;i;i--)
		if(i+a[i]<=bl[i]*block)
			f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
		else
			f[i]=1,g[i]=i+a[i];
	while(m--){
		I=read(),J=read();
		if(I){
			int ans=0;
			for(int i=J;i<=n;i=g[i])
				ans+=f[i];
			while(J+a[J]<=n)
				J+=a[J];
			out(J),putchar(' '),out(ans),putchar(10);
		}
		else{
			K=read();
			add(J,K);
		}
	}
	return 0;
}
2022/6/9 20:58
加载中...