萌新求助,vector在push_back/insert时玄学RE
查看原帖
萌新求助,vector在push_back/insert时玄学RE
114859
shight楼主2022/5/2 10:52
#include <bits/stdc++.h>
#define int long long
#define N 1000005
#define mkp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define int_edge int to[N<<1],nxt[N<<1],val[N<<1],head[N],cnt=0
using namespace std;
int n,ans=0,dep[N],l[N],son[N];
int_edge;
vector<int>f[N],g[N];
void add_edge(int x,int y){
	to[++cnt]=y;nxt[cnt]=head[x];head[x]=cnt;
}
void dfs1(int nw,int lst){
	dep[nw]=dep[lst]+1;
	for(int i=head[nw];i;i=nxt[i])
		if(to[i]!=lst){
			dfs1(to[i],nw);
			if(l[to[i]]>l[son[nw]])son[nw]=to[i];
		}
	l[nw]=l[son[nw]]+1;
}
void dfs(int nw,int lst){
	if(son[nw]){
		dfs(son[nw],nw);
		swap(f[nw],f[son[nw]]);
		f[nw].pb(1);g[son[nw]].pop_back();
		swap(g[nw],g[son[nw]]);
		while(g[nw].size()<l[nw]){
			//if(nw==2)cout<<g[nw].size()<<" "<<l[nw]<<endl;
			g[nw].insert(g[nw].begin(),0);// 就是这个地方,当nw==2的时候第2次insert就爆了,改成push_back效果相同
			//if(nw==2)cout<<g[nw].size()<<" "<<l[nw]<<endl;
		}
		//if(nw==2)puts("&&&");
     
		for(int i=head[nw];i;i=nxt[i])
			if(to[i]!=lst&&to[i]!=son[nw]){
				dfs(to[i],nw);
				int pos1=f[to[i]].size()-1,pos2=g[nw].size()-2;
				while(pos1>=0&&pos2>=0)ans+=f[to[i]][pos1--]*g[nw][pos2--];
				pos1=f[nw].size()-1,pos2=g[to[i]].size()-2;
				while(pos1>=0&&pos2>=0)ans+=f[nw][pos1--]*g[to[i]][pos2--];
				pos1=g[nw].size()-1,pos2=g[to[i]].size()-2;
				while(pos1>=0&&pos2>=0)g[nw][pos1--]+=g[to[i]][pos2--];
				pos1=g[nw].size()-2,pos2=f[to[i]].size()-1;
				while(pos1>=0&&pos2>=0)g[nw][pos1]+=f[nw][pos1--]*f[to[i]][pos2--];
				pos1=f[nw].size()-1,pos2=f[to[i]].size()-2;
				while(pos1>=0&&pos2>=0)f[nw][pos1--]+=f[to[i]][pos2--];
			}
	}
	else{
		f[nw].pb(1);
		g[nw].pb(0);
	}
}
signed main() {
	scanf("%lld",&n);
	for(int i=1,x,y;i<n;i++){
		scanf("%lld %lld",&x,&y);
		add_edge(x,y);add_edge(y,x);
	}
	dfs1(1,0);dfs(1,0);
	printf("%lld\n",ans);
	return 0;
}

RT,在dfs求答案的有注释的那个部分迷之RE,具体为insert后程序直接崩溃,改成push_back也是一样的情况,经过多次尝试后发现只要连续两次push_back/insert就必然RE,中间还卡出来过玄学,即几次RE几次正常运行,bdfs无果,所以前来求助,谢谢各位大佬!(萌新滚回去码指针了。。。)

2022/5/2 10:52
加载中...