NOIp T4 的错误求问 (Segmentation fault)
  • 板块学术版
  • 楼主Kevin_Helium
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/30 17:01
  • 上次更新2024/11/30 18:56:22
查看原帖
NOIp T4 的错误求问 (Segmentation fault)
649464
Kevin_Helium楼主2024/11/30 17:01

NOIp T4 我的部分分写法会报a.exe已停止工作
用gdb运行后出现如下错误提示:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004044a7 in std::vector<int, std::allocator<int> >::begin (this=0x463ed8 <e+368184>) at c:/mingw64/include/c++/9.3.0/bits/stl_vector.h:809
809           { return iterator(this->_M_impl._M_start); }
(gdb) q

bdfs说是由于无效指针引用或内存访问引起,但是源代码未使用指针(有可能vector出锅了?),求问大佬如何调,以及这个大概可以拿多少分。

源码(赛后版):

#include <bits/stdc++.h>
#define fu(i,a,b) for(register int i=(a);i<=(b);i++)
#define fd(i,a,b) for(register int i=(a);i>=(b);i--)
using namespace std;

const int MAXN=5e5+10;
int n;
vector <int> e[MAXN];
int fa[MAXN],son[MAXN],siz[MAXN],dep[MAXN];
int top[MAXN];

void dfs1(int u,int fath){
    fa[u]=fath,siz[u]=1;
    dep[u]=dep[fath]+1;
    for(int v:e[u]) if(v!=fath){
        dfs1(v,u);
        siz[u]+=siz[v];
        if(siz[v]>siz[son[u]]) son[u]=v;
    }
}
void dfs2(int u,int topf){
    top[u]=topf;
    if(son[u]) dfs2(son[u],topf);
    for(int v:e[u]) if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
}
int LCA(int u,int v){
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        u=fa[top[u]];
    }
    return (dep[u]>dep[v]?v:u);
}

struct Node{
    int l,r,fa;
}seg[MAXN<<2];
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)

inline void pushup(int p){
    seg[p].fa=LCA(seg[ls(p)].fa,seg[rs(p)].fa);
}
void build(int p,int l,int r){
    seg[p].l=l,seg[p].r=r;
    if(l==r){seg[p].fa=l;return;}
    int mid=(l+r)>>1;
    build(ls(p),l, mid );
    build(rs(p),mid+1,r);
    pushup(p);
}
int query(int p,int q_l,int q_r){
    int l=seg[p].l,r=seg[p].r;
    if(q_l<=l&&r<=q_r) return seg[p].fa;
    int mid=(l+r)>>1,res=-1;
    if(q_l<=mid) res=query(ls(p),q_l,q_r);
    if(q_r> mid) {
        int tmp=query(rs(p),q_l,q_r);
        if(res==-1) res=tmp;
        else res=LCA(res,tmp);
    }
    return res;
}

inline int ask(int l,int r,int k){
    int ans=0;
    fu(i,l,r-k+1){
        int res=query(1,i,i+k-1);
        if(dep[res]>ans) ans=dep[res];
    }
    return ans;
}

inline void file(){
    string File="query";
    freopen((File+".in" ).c_str(),"r",stdin );
    freopen((File+".out").c_str(),"w",stdout);
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    file();
    cin>>n;
    fu(i,2,n){
        int u,v;
        cin>>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
    int q,l,r,k;
    cin>>q;
    while(q--){
        cin>>l>>r>>k;
        cout<<ask(l,r,k)<<"\n";
    }
    return 0;
}
2024/11/30 17:01
加载中...