GPLT2022天梯赛L3-2

Posted goto_1600

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPLT2022天梯赛L3-2相关的知识,希望对你有一定的参考价值。

考虑计算贡献

#include<bits/stdc++.h>
using namespace std;
vector<int>v[300010];
#define int long long
int res=0;
const int mod=1e9+7;
vector<int>tmp;
int qmi(int a,int b)

	int res=1;
	while(b)
	
		if(b&1)	res=res*a%mod;
		b>>=1;
		a=a*a%mod;
	
	return res;

int n;
int rt;
int tr[300010];
int lowbit(int x)

	return x&-x;

int query(int x)

	int res=0;
	for(int i=x;i;i-=lowbit(i))
	
		res+=tr[i];
	
	return res;

void add(int x,int d)

	for(int i=x;i<300010;i+=lowbit(i))
	
		tr[i]+=d;
	

int fact[300010];
int dp[300010];
int dep[300010];
int f[300010];
int sz[300010];
int sum[300010];
void dfs(int u,int fa)

	f[u]=fa;
	dep[u]=dep[fa]+1;
	dp[u]=1;
	sz[u]=1;
	int cnt=0;
	int tot=0;
	for(auto j:v[u])
	
		if(j==fa)	continue;
		cnt++;
		dfs(j,u);
		sum[u]++;
		tot+=sz[j];
		sz[u]+=sz[j];
		dp[u] = dp[u] *dp[j]%mod;
	
	dp[u]=dp[u]*fact[cnt]%mod;

int tot=0;
void dfs2(int u,int fa)

	add(u,1);
	// cout<<u<<" "<<query(300010-1)-query(u)<<endl;
	tot+=query(300010-1)-query(u);
	int tt=0;
	for(auto j:v[u])
	
		if(j==fa)	continue;
		res=(res+dp[rt]*tt*sz[j]%mod*qmi(2,mod-2))%mod;
		dfs2(j,u);
		tt+=sz[j];
	
	add(u,-1);


signed main()

	
	
	cin>>n>>rt;
	fact[0]=1;
	for(int i=1;i<300010;i++)
		fact[i]=fact[i-1]*i%mod;
	for(int i=0;i<n-1;i++)
	
		int a,b;
		cin>>a>>b;
		v[a].push_back(b);
		v[b].push_back(a);
	
	dfs(rt,0);
	dfs2(rt,0);	
	res+=tot%mod*dp[rt]%mod;
	cout<<res<<endl;


以上是关于GPLT2022天梯赛L3-2的主要内容,如果未能解决你的问题,请参考以下文章

2016年 团体程序设计天梯赛 - 模拟赛

2022团体程序设计天梯赛GPLT2022,L1~L2部分(PTA,L1-081~L1-088,L2-041~L2-044)题解代码&复盘

2022团体程序设计天梯赛GPLT2022,L1~L2部分(PTA,L1-081~L1-088,L2-041~L2-044)题解代码&复盘

牛客 2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 签到题13题

牛客 2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 签到题13题

2022团体程序设计天梯赛