G

题目要求从任意点出发能走的最远距离,观察到一段路程内所有点一定都以唯一一点为终点

如:

障碍数组n1 n2 n3 n4 n5为5 0 0 2 0

则n2,n3,n4都会以n4为终点

因此参考并查集递归实现路径压缩编写代码

对于本题来说,相较于用map/set实现的代码,本方法在内存占用上有显著优势,但运行时间基本无差异

附上代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int b[1000005];//去往的最远距离
int n,m;
inline int read(void)
{
    int ans=0;bool f=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
    return f?-ans:ans;
}
int further(int pos){
    int to=b[pos];
    if(a[to]<=0&&pos<n){
        b[pos]=further(to+1);
    }
    return b[pos];
}
int main(){
    int index,i,p,x;
    n=read();
    m=read();
    for(i=1;i<=n;i++){
        a[i]=read();
        b[i]=i;
    }
    for(i=0;i<m;i++){
        index=read();
        if(index==1){
            p=read();
            x=read();
            if(a[p]<=0)    continue;
            a[p]-=x;
        }
        else{
            p=read();
            b[p]=further(b[p]);
            cout<<b[p]<<endl;
        }
    }
}