CF E求调
  • 板块学术版
  • 楼主ztlh
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/29 01:43
  • 上次更新2024/12/29 13:19:56
查看原帖
CF E求调
473071
ztlh楼主2024/12/29 01:43

样例最后一组数据挂了,输出168

#include<bits/stdc++.h>
#define ll long long
#define db long double
#define clr fflush(stdout)
#define pii std::pair<int,int>
#define N 200005
#define Md 1000000007
#define Nd 998244353
#define Inf 0x3f3f3f3f
using namespace std;
int T,n;
vector<int> tr[N];
bool isl[N];
bool isr[N];
int cntl;
int cntr[N];
ll ans;
int siz[N];
void dfs(int u,int fa){
	cntr[u]=(isr[u]?1:0);
	siz[u]=1;
	for(int to:tr[u])
		if(to!=fa){
			dfs(to,u);
			cntr[u]+=cntr[to];
			siz[u]+=siz[to];
		}
}
ll s;
void dfs2(int u,int fa,int lst){
	if(isr[u]&&!isl[u]){
		s=lst;
		for(int to:tr[u])
			if(to!=fa) s+=siz[to]-cntr[to];
		for(int to:tr[u])
			if(to!=fa&&!isl[to]) ans+=s-(siz[to]-cntr[to]);
		if(!isl[fa]) ans+=s-lst;
	}
	for(int to:tr[u])
		if(to!=fa) dfs2(to,u,lst+(isr[u]?0:1));
}
int main(){
	scanf("%d",&T);
	while(T--){
		for(int i=1;i<=n;i++){
			isl[i]=0;
			isr[i]=0;
			tr[i].clear();
			cntr[i]=0;
			siz[i]=0;
		}
		scanf("%d",&n);
		for(int i=1,u,v;i<n;i++){
			scanf("%d%d",&u,&v);
			tr[u].push_back(v);
			tr[v].push_back(u);
		}
		cntl=0;
		for(int i=1;i<=n;i++)
			if(tr[i].size()==1) isl[i]=1,cntl++;
		ans=cntl*(ll)(n-cntl);
		for(int i=1;i<=n;i++){
			if(isl[i]) isr[i]=1;
			for(int j:tr[i]) if(isl[j]) isr[i]=1;
		}
		dfs(1,0);
		dfs2(1,0,0);
		printf("%lld\n",ans);
	}
	return 0;
}
2024/12/29 01:43
加载中...