首页 > 其他分享 >[ARC087F] Squirrel Migration 题解

[ARC087F] Squirrel Migration 题解

时间:2024-02-27 22:00:30浏览次数:28  
标签:sz Squirrel int 题解 路径 times ARC087F mx define

如果两条路径不存在交点,则两条路径各选一个端点交换后两路径相交,答案不会变劣。

考虑所有路径两两相交的情况,因为图是一棵树,所以这些路径会交于一点。以这个点为根,那么最大的子树大小一定不超过 \(\frac n 2\),所以这个点是树的重心,每条路径的端点一定在两个不同的子树内。如果这个树存在两个重心,则以其中一个为根,显然另一个重心的子树大小一定为 \(\frac n 2\),所以每条路径都有一个端点在这个子树中,即所有路径共有两个交点,随便以一个重心为根计算答案即可。

考虑怎么计算答案,直接用背包做好像过不去,正难则反,考虑容斥。

记 \(f_i\) 表示钦定 \(i\) 个点满足这些点与对应 \(p\) 的路径在同一个子树内,这些点的 \(p\) 值有多少种可能。每次加入一个大小为 \(s\) 的子树时,易得转移:

\[f_i=\sum_{j=0}^{\min(i,s)} {s\choose j}^2\times j!\times{f'}_{i-j} \]

那么答案就是:

\[\sum_{i=0}^n (-1)^i\times (n-i)!\times f_i \]

然后这道题就做完了,时间复杂度 \(O(n^2)\)。

参考代码:

#include<bits/stdc++.h>
#define ll long long
#define mxn 5003
#define md 1000000007
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define rept(i,a,b) for(int i=a;i<b;++i)
using namespace std;
int n,rt,ans,sz[mxn],c[mxn][mxn],d[mxn],dp[2][mxn];
vector<int>s,g[mxn];
ll fac[mxn];
bool fl;
void dfs(int x,int fa){
	sz[x]=1;
	int mx=0;
	for(int i:g[x])if(i!=fa){
		dfs(i,x);
		mx=max(mx,sz[i]);
		sz[x]+=sz[i];
	}
	mx=max(mx,n-sz[x]);
	if(mx*2<=n)rt=x;
}
void dfs1(int x,int fa){
	sz[x]=1;
	for(int i:g[x])if(i!=fa){
		dfs1(i,x);
		sz[x]+=sz[i];
	}
}
void solve(){
	memset(dp,0,sizeof(dp));
	fl=0;
	dp[0][0]=1;
	int sz=1;
	for(int i:s){
		fl^=1;
		memset(dp[fl],0,sizeof(dp[fl]));
		rep(j,0,sz)if(dp[fl^1][j]){
			rep(k,0,i){
				dp[fl][j+k]=(dp[fl][j+k]+dp[fl^1][j]*fac[k]%md*c[i][k]%md*c[i][k])%md;
			}
		}
		sz+=i;
	}
	rep(i,0,sz){
		if(i&1)ans=(ans-dp[fl][i]*fac[sz-i])%md;
		else ans=(ans+dp[fl][i]*fac[sz-i])%md;
	}
}
signed main(){
	scanf("%d",&n);
	fac[0]=1;
	rep(i,1,n)fac[i]=fac[i-1]*i%md;
	c[0][0]=1;
	rep(i,1,n){
		c[i][0]=1;
		rep(j,1,i)c[i][j]=(c[i-1][j-1]+c[i-1][j])%md;
	}
	for(int i=1,x,y;i<n;++i){
		scanf("%d%d",&x,&y);
		g[x].pb(y),g[y].pb(x);
	}
	dfs(1,0);
	dfs1(rt,0);
	s.clear();
	for(int i:g[rt])s.pb(sz[i]);
	solve();
	cout<<(ans+md)%md;
	return 0;
}

标签:sz,Squirrel,int,题解,路径,times,ARC087F,mx,define
From: https://www.cnblogs.com/zifanoi/p/18038508

相关文章

  • 个人题解:2024 年湖北省省队选拔集训暨能力测试 第一试
    时与风对每条边进行BFS。二维偏序部分用vector存一下就行了。花神诞日引理:对于\(a<b<c\),\(\min(a\text{XOR}b,b\text{XOR}c)\leqa\text{XOR}c\)。证明:考虑比较\(a,c\)二进制下第一位不同,也就是\(a=(X0\dots)_{(2)},c=(X1\dots)_{2}\)。因为\(b\in(a,c)\)所以......
  • CSP-S 2023 题解
    T1一开始所有密码都没被标记。对于每个输入的状态枚举一遍所有没标记的密码,判断是否可能是正确密码,如果不行就标记一下。最后输出没被标记的密码个数。总共只有\(10^5\)个密码,可以轻松通过。难度:橙。T2见CF1223FStackExterminableArrays题解。难度:蓝。T3大模拟,直......
  • 2024牛客寒假算法基础集训营5 题解 ( A,C,G,H,I,L,M )
    2024牛客寒假算法基础集训营5题解(A,C,G,H,I,L,M)A mutsumi的质数合数题意有一个由\(n\)个正整数组成的数组,她想知道数组中质数和合数共有几个。思路由质数和合数的定义可知,正整数范围内除\(1\)外,要么是质数要么是合数,本题直接统计不是\(1\)的正整数的个数即可代码......
  • 题解 CF963E Circles of Waiting
    令\(f_{i,j}\)表示\((i,j)\)走出以\((0,0)\)为圆心,半径为\(R\)的期望步数,显然所有在圆外的点\((i,j)\)满足\(f_{i,j}=0\)。有\(f_{i,j}=p_1f_{i-1,j}+p_2f_{i,j-1}+p_3f_{i+1,j}+p_4f_{i,j+1}\)。这东西很套路,高斯消元就行,但状态数是\(O(R^2)\)的,复杂度\(O(R^......
  • 题解 CF725G Messages on a Tree
    updateon2023.8.9修正了一些错误。\(\texttt{link}\)第\(i\)条信息的传输可以表示成\(x_i\)走到\(x_i\)的某一祖先再走回\(x_i\)的路径。所以答案只和\(x_i\)的这一祖先有关,记为\(f_i\),则\(ans_i=t_i+2\timesdep_{x_i}-2\timesdep_{f_i}\)。若\(x_i\)在\(f......
  • 题解 CF1781G Diverse Coloring
    \(\texttt{link}\)题意给定一棵\(n\)个点的二叉树,现对其每个点染成黑色或白色。一种合法的染色方案满足:对于所有黑色的点,都存在白色的点与之相邻。对于所有白色的点,都存在黑色的点与之相邻。一种染色方案的权值是染成黑色的点数与染成白色的点数之差的绝对值。\(\foral......
  • 题解 CF1523H Hopping Around the Array
    \(\texttt{link}\)题意数轴上有\(n\)个点,每个点有属性\(a_i\),在第\(i\)个点可以花费\(1\)的步数移动至\([i,i+a_i]\)中任意一个点。定义一次操作为选出一个\(i\),使\(a_i\getsa_i+1\)。\(q\)组询问,每次给出\(l,r,k\),求有\(k\)次操作机会时,从第\(l\)个点走到......
  • 题解 CF983D Arkady and Rectangles
    \(\texttt{link}\)题意平面直角坐标系上给定\(n\)个矩形,第\(i\)个矩形颜色为\(i\),颜色大的矩形将覆盖颜色小的矩形,问最后能看到几种颜色。\(1\len\le10^5,|x_i|,|y_i|\le10^9\)题解首先离散化,考虑扫描线如何维护序列上的颜色。一个区间\([l,r]\)投射到线段树上\(......
  • AT_arc117_c [ARC117C] Tricolor Pyramid 题解
    [ARC117C]TricolorPyramid博客阅读体验(也许)更佳题意给一个金字塔的底部颜色组成和生长规律,问顶部的颜色是什么。分析试几次就可以很容易得到的一种构造:令颜色B为\(0\),W为\(1\),R为\(2\)。设左右两个方块的颜色分别为\(col_l\)和\(col_r\),则生长规则可以描......
  • P5605 小 A 与两位神仙 题解
    推销博客P5605小A与两位神仙题意给定\(x\)、\(y\)和\(m\),其中\(m=p^n,n\in\mathbb{N+},p\ge3\),问同余方程\(x^a\equivy\pmodm\)是否有非负整数解。分析前置芝士Pollard_rho原根化简对这种指数型的同余方程是很难解决的,我们要先把它转化成线性的同余方......