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的主要内容,如果未能解决你的问题,请参考以下文章
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题