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;
}