萌新求助,两个写法看不出区别
查看原帖
萌新求助,两个写法看不出区别
122794
tuya_楼主2020/12/20 21:11

AC:

for(int j=num[i];j>=1;j--){
			if(j+k[i][j]>num[i]){
				f[i][j]=1;
				to[i][j]=j+k[i][j]-num[i];
			}
			else {
				f[i][j]=f[i][j+k[i][j]]+1;
				to[i][j]=to[i][j+k[i][j]];
			}
		}

20pts:

for(int j=num[i];j>=1;j--){
			    if(j+k[i][j]>num[i]) to[i][j]=j+k[i][j]-num[j];
			    else to[i][j]=to[i][j+k[i][j]];
		    }
			for(int j=num[i];j>=1;j--){	
		        if(j+k[i][j]>num[i]) f[i][j]=1;
		        else f[i][j]=f[i][j+k[i][j]]+1;
			}

总代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=200010;
const int ssr=460;
int sr,n,m;
int k[ssr][ssr],tot;
int f[ssr][ssr],to[ssr][ssr];
int l[ssr],r[ssr],num[ssr];
int main(){
	freopen("1.txt","r",stdin);
	freopen("12.txt","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) if(i*i>=n) {
		sr=i;break;
	}
	for(int i=1;i*sr<=n;i++) tot=i;
	if(n%sr!=0) tot++;
	for(int i=1;i<=tot;i++){
		l[i]=(i-1)*sr+1;
		r[i]=min(i*sr,n);
		num[i]=r[i]-l[i]+1;
    }
	for(int i=1;i<=tot;i++)
		for(int j=1;j<=num[i];j++)
			scanf("%d",&k[i][j]);
	for(int i=1;i<=tot;i++){
		for(int j=num[i];j>=1;j--){
			if(j+k[i][j]>num[i]){
				f[i][j]=1;
				to[i][j]=j+k[i][j]-num[i];
			}
			else {
				f[i][j]=f[i][j+k[i][j]]+1;
				to[i][j]=to[i][j+k[i][j]];
			}
		}
	}
	//cout<<f[1][1]<<endl;
	//21761 
	//317
	scanf("%d",&m);
	for(int kl=1;kl<=m;kl++){
		int op,x;
		scanf("%d%d",&op,&x);
		x++;
		if(op==1){
			int now=1;
			while(r[now]<x) now++;
			x=x-l[now]+1;
		    int ans=0;
		    for(int i=now;i<=tot;i++){
		    	ans+=f[i][x];
		    	x=to[i][x];
		    	while(x>num[i+1]&&i<=tot) {
		    		i++;x-=num[i+1];
				}
			}
		    printf("%d\n",ans);
		}
		if(op==2){
			int c;
			scanf("%d",&c);
			int i=1;
			while(r[i]<x) i++;
			x=x-l[i]+1;
			k[i][x]=c;
			/*
			for(int j=num[i];j>=1;j--){
			    if(j+k[i][j]>num[i]) to[i][j]=j+k[i][j]-num[j];
			    else to[i][j]=to[i][j+k[i][j]];
		    }
			for(int j=num[i];j>=1;j--){	
		        if(j+k[i][j]>num[i]) f[i][j]=1;
		        else f[i][j]=f[i][j+k[i][j]]+1;
			}
		    */
		    for(int j=num[i];j>=1;j--){
			if(j+k[i][j]>num[i]){
				f[i][j]=1;
				to[i][j]=j+k[i][j]-num[i];
			}
			else {
				f[i][j]=f[i][j+k[i][j]]+1;
				to[i][j]=to[i][j+k[i][j]];
			}
		}
		}
	}
	return 0;
}
2020/12/20 21:11
加载中...