家人们谁懂啊,每次分块就TLE
查看原帖
家人们谁懂啊,每次分块就TLE
1023726
summerer楼主2023/6/20 18:49
#include <bits/stdc++.h>
using namespace std;

const int N=2e5;
int a[N];
int step[N]={0};
int st[N];
int ed[N];
int to[N];
int pos[N];
void update(int b)
{
    int i,j;
    for(i=st[b];i<=ed[b];i++)
    {
        step[i]=0;
        for(j=i;j<=ed[b];)
        {
            j+=a[j];
            step[i]++;
        }
        to[i]=j;
    }
}
int main()
{
    int i,n,d,c,m,b;
    int cnt;
    scanf("%d",&n);
    int blocks=sqrt(n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(i=1;i<=blocks;i++)
    {
        st[i]=(i-1)*blocks;
        ed[i]=i*blocks-1;
    }
    ed[blocks]=n-1;
    for(i=0;i<n;i++)
    {
        pos[i]=i/blocks+1;
    }
    for(i=1;i<=blocks;i++)
    {
        update(i);
    }
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%d",&b);
        if(b==1)
        {
            cnt=0;
            scanf("%d",&c);
            for(;c<n;)
            {
                cnt+=step[c];
                c=to[c];
            }
            printf("%d\n",cnt);
        }
        else
        {
            scanf("%d %d",&c,&d);
            a[c]=d;
            update(pos[c]);
        }
    }
}

2023/6/20 18:49
加载中...