求助段错误
查看原帖
求助段错误
339846
RuntimeErr楼主2022/2/4 19:21

RT,不知道哪里有问题

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
template <typename T>
inline void read(T& r) {
    r=0;bool w=0; 
    char ch=getchar();
    while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
    while(ch>='0'&&ch<='9') r=(r<<3)+(r<<1)+(ch^48), ch=getchar();
    r=w?-r:r;
}

#define ui unsigned int
ui s;

ui get(ui x){
    x^=x<<13;
    x^=x>>17;
    x^=x<<5;
    return s=x; 
}

const int N=5e5+10;

int n,q,rt;
int h[N],e[N],ne[N],idx,lg[N];
int fa[N][25],son[N],dep[N],d[N],top[N];
vector<int> up[N],down[N];

void add(int a,int b){
    e[++idx]=b,ne[idx]=h[a],h[a]=idx;
}

void dfs1(int u){
    d[u]=d[fa[u][0]]+1;
    for(int i=1;i<=19;++i)
        fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=h[u];i;i=ne[i]){
        int v=e[i];
        dfs1(v);
        if(dep[v]>dep[son[u]])son[u]=v;
    }
    dep[u]=dep[son[u]]+1;
}
void dfs2(int u,int t){
    top[u]=t;
    if(u==t){
        for(int i=0,p1=u,p2=u;i<=dep[u]-d[u];++i){
            up[u].push_back(p1);
            down[u].push_back(p2);
            p1=fa[p1][0],p2=son[p2];
        }
    }
    if(son[u])dfs2(son[u],t);
    for(int i=h[u];i;i=ne[i]){
        int v=e[i];if(v==son[u])continue;
        dfs2(v,v);
    }
    
}
int query(int u,int k){
    if(!k)return u;
    u=fa[u][lg[k]],k-=1<<lg[k];
    k-=d[u]-d[top[u]],u=top[u];
    return k>0?up[u][k]:down[u][-k];
}

int main(){
    read(n),read(q),read(s);
    for(int i=1,f;i<=n;++i){
        read(f);fa[i][0]=f;
        if(!f)rt=i; else add(f,i);
        if(i>1)lg[i]=lg[i>>1]+1;
    }
    dfs1(rt),dfs2(rt,rt);
    int x,k,lstans=0;long long ans=0;
    for(int i=1;i<=q;++i){
        x=((get(s)^lstans)%n)+1;
        k=(get(s)^lstans)%d[x];
        lstans=query(x,k);
        ans^=1ll*i*lstans;
        
    }
    printf("%lld\n",ans);
    return 0;
}#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
template <typename T>
inline void read(T& r) {
    r=0;bool w=0; 
    char ch=getchar();
    while(ch<'0'||ch>'9') w=ch=='-'?1:0,ch=getchar();
    while(ch>='0'&&ch<='9') r=(r<<3)+(r<<1)+(ch^48), ch=getchar();
    r=w?-r:r;
}

#define ui unsigned int
ui s;

ui get(ui x){
    x^=x<<13;
    x^=x>>17;
    x^=x<<5;
    return s=x; 
}

const int N=5e5+10;

int n,q,rt;
int h[N],e[N],ne[N],idx,lg[N];
int fa[N][25],son[N],dep[N],d[N],top[N];
vector<int> up[N],down[N];

void add(int a,int b){
    e[++idx]=b,ne[idx]=h[a],h[a]=idx;
}

void dfs1(int u){
    d[u]=d[fa[u][0]]+1;
    for(int i=1;i<=19;++i)
        fa[u][i]=fa[fa[u][i-1]][i-1];
    for(int i=h[u];i;i=ne[i]){
        int v=e[i];
        dfs1(v);
        if(dep[v]>dep[son[u]])son[u]=v;
    }
    dep[u]=dep[son[u]]+1;
}
void dfs2(int u,int t){
    top[u]=t;
    if(u==t){
        for(int i=0,p1=u,p2=u;i<=dep[u]-d[u];++i){
            up[u].push_back(p1);
            down[u].push_back(p2);
            p1=fa[p1][0],p2=son[p2];
        }
    }
    if(son[u])dfs2(son[u],t);
    for(int i=h[u];i;i=ne[i]){
        int v=e[i];if(v==son[u])continue;
        dfs2(v,v);
    }
    
}
int query(int u,int k){
    if(!k)return u;
    u=fa[u][lg[k]],k-=1<<lg[k];
    k-=d[u]-d[top[u]],u=top[u];
    return k>0?up[u][k]:down[u][-k];
}

int main(){
    read(n),read(q),read(s);
    for(int i=1,f;i<=n;++i){
        read(f);fa[i][0]=f;
        if(!f)rt=i; else add(f,i);
        if(i>1)lg[i]=lg[i>>1]+1;
    }
    dfs1(rt),dfs2(rt,rt);
    int x,k,lstans=0;long long ans=0;
    for(int i=1;i<=q;++i){
        x=((get(s)^lstans)%n)+1;
        k=(get(s)^lstans)%d[x];
        lstans=query(x,k);
        ans^=1ll*i*lstans;
        
    }
    printf("%lld\n",ans);
    return 0;
}
2022/2/4 19:21
加载中...