灵异事件
  • 板块灌水区
  • 楼主scyFBM
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/1/7 21:12
  • 上次更新2024/1/8 13:33:05
查看原帖
灵异事件
766405
scyFBM楼主2024/1/7 21:12

今天使用dev-c++编译运行如下代码后,程序直接异常退出并返回3221225595

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100009;
int n,m,f[N],dep[N],sz[N],id[N],son[N],top[N];
vector<int> e[N];
int cnt;
void dfs1(int x,int fa,int d){
	f[x]=fa,dep[x]=d,sz[x]=1;
	for(int i=0;i<e[x].size();i++){
		int v=e[x][i];
		if(v==fa) continue;
		dfs1(v,x,d+1);
		sz[x]+=sz[v];
		if(sz[e[x][i]]>sz[son[x]]) son[x]=e[x][i];
	}
}
void dfs2(int x,int fa){
	id[x]=++cnt;
	if(x==son[fa]) top[x]=top[fa];
	else top[x]=x;
	if(!son[x]) return;
	dfs2(son[x],x);
	for(int i=0;i<e[x].size();i++)if(e[x][i]!=fa&&e[x][i]!=son[x]) dfs2(e[x][i],x);
}
int bl,x[N],a[N],b[N],bs[N],c[N],bsz[N];
void init(){
	bl=sqrt(n);
	int cntb=1;
	for(int i=1;i<=n;i++){
		b[i]=cntb,bsz[b[i]]++;
		if(i%bl==0) cntb++;
	}
	for(int i=1;i<cntb;i++) c[i]=2;
	for(int i=1;i<=n;i++) bs[b[i]]+=1;
}
void push_down(int x){
	if(c[x]==2) return;
	int l=bl*(x-1)+1;
	for(int i=l;i<=l+bsz[i]-1;i++) a[i]=c[x];
	c[x]=2;
}
void upd(int l,int r,int k){
	push_down(b[l]);
	push_down(b[r]);
	if(b[l]==b[r]){
		for(int i=l;i<=r;i++) bs[b[i]]+=(k-a[i]),a[i]=k;
		return;
	}
	for(int i=l;b[i]==b[l];i++) bs[b[i]]+=(k-a[i]),a[i]=k;
	for(int i=r;b[i]==b[r];i--) bs[b[i]]+=(k-a[i]),a[i]=k;
	for(int i=b[l]+1;i<=b[r]-1;i++){
		c[i]=k;
		bs[i]=k*bsz[i];
	}
}
int query(int l,int r){
	push_down(b[l]);
	push_down(b[r]);
	int ans=0;
	if(b[l]==b[r]){
		for(int i=l;i<=r;i++) ans+=a[i];
		return ans;
	}
	for(int i=l;b[i]==b[l];i++) ans+=a[i];
	for(int i=r;b[i]==b[r];i--) ans+=a[i];
	for(int i=b[l]+1;i<=b[r]-1;i++) ans+=bs[i];
	return ans;
}
int querypath(int u,int v){
	int ans=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		ans+=query(id[top[u]],id[u]);
		upd(id[top[u]],id[u],0);
		u=f[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	ans+=query(id[u],id[v]);
	upd(id[u],id[v],0);
	return ans;
}
int queryson(int u){
	int ans=sz[u]-query(id[u],id[u]+sz[u]-1);
	upd(id[u],id[u]+sz[u]-1,1);
	return ans;
}
signed main(){
	cin>>n>>m; 
	for(int i=2;i<=n;i++){
		int u;
		cin>>u;
		e[i].push_back(u+1);
		e[u+1].push_back(i);
	}
	dfs1(1,1,0);
	dfs2(1,0);
	init();
	while(m--){
		int op,x;
		cin>>op>>x;
		x++;
		if(op==1) cout<<querypath(1,x)<<endl;
		if(op==2) cout<<queryson(x)<<endl;
	}
	return 0;
}

关键是,我把主函数内内容全部注释掉之后,程序依然是异常退出了,放到在线IDE里面结果也是差不多,这是啥情况啊

2024/1/7 21:12
加载中...