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