求助,弹飞绵羊AC本题WA
  • 板块CF13E Holes
  • 楼主lzqy_
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/8/9 19:16
  • 上次更新2023/11/4 11:23:54
查看原帖
求助,弹飞绵羊AC本题WA
288716
lzqy_楼主2021/8/9 19:16

rt,代码中有注释说明,本代码与弹飞绵羊AC代码不同之处。

#include<bits/stdc++.h>
#define x first
#define y second
const int maxn=100010;
const int maxqn=455;
using namespace std;
inline int read(){
	register int x=0;
	register char c=getchar();
	for(;!(c>='0'&&c<='9');c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+c-'0';
	return x;
}
int n,m,qn;
int a[maxn],block[maxn];	
int f[maxn],g[maxn]; 
int L[maxqn],R[maxqn];
void change(int k,int x){
	//不变
	a[k]=x;
	register int blo=block[k];
	for(register int i=R[blo];i>=L[blo];i--){
		if(i+a[i]>n)
			f[i]=1,g[i]=-1;
		else if(block[i+a[i]]==block[i])
			f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
		else
			f[i]=1,g[i]=i+a[i];
	}
}
pair<int,int> getans(int x){
	//多加了ans统计最后调到的位置,其他不变
	register int sum=0,ans=x;
	while(x!=-1)
		sum+=f[x],ans=x,x=g[x];
	return make_pair(ans,sum);
}
int main(){
	//不变
	n=read(),m=read(),qn=sqrt(n);
	for(register int i=1;i<=n;i++)
		a[i]=read(),block[i]=(i-1)/qn+1;
	for(register int i=1;i<=block[n];i++)
		L[i]=(i-1)*qn+1,R[i]=min(i*qn,n);
	register int opt,x,y; 
	for(register int i=n;i;i--){
		if(i+a[i]>n)
			f[i]=1,g[i]=-1;
		else if(block[i+a[i]]==block[i])
			f[i]=f[i+a[i]]+1,g[i]=g[i+a[i]];
		else
			f[i]=1,g[i]=i+a[i];
	}
	pair<int,int>t;
	while(m--){
      //将x=read()+1换成了x=read()
		opt=read(),x=read();
		if(opt==1) 
			t=getans(x),printf("%d %d\n",t.x,t.y);
		else change(x,read());
	}
	return 0;
}
2021/8/9 19:16
加载中...