[BZOJ4835] [Lydsy1704月赛] 遗忘之树 [乱搞]

本文详细解析了BZOJ-4835题目的解法,利用图论和动态规划技术,在O(nlogn)的时间复杂度下,解决了关于图的重心变化问题。通过判断子树大小,确定连边方式,避免重心改变,实现了高效的计数算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Link
BZOJ - https://www.lydsy.com/JudgeOnline/problem.php?id=4835


直接在图 G 上 dp 。
考虑图 G 上的 u → v
u 能够连几条边到 v 呢 ?重点在于连边之后重心会不会变
如果图 G 中 v 为根的子树大小卜大于等于以 u 为根的子树的一半那么咋连边都没有问题
否则这个子树大小一定等于 u u u 为根子树大小的一半,此时你只能向以 v 为根的子树里面编号大于 u 的点连边。
(否则重心就会变嗷)
以此为依据计数即可,复杂度是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 的。
某个子树有两个重心的情况需要特别分类讨论。


#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cctype>
using namespace std;
#define R register
const int MAXN = 1e5 + 5;
const int MOD = 1e9 + 7;
int T, n, m, tot, Root;
int head[MAXN], nxt[MAXN], to[MAXN], Deg[MAXN], Size[MAXN];
long long F[MAXN];
#define add_edge(a, b) nxt[++tot] = head[a], head[a] = tot, to[tot] = b
void Sizel(const int& u)
{
	Size[u] = 1;
	for (int v, i = head[u]; i; i = nxt[i])
	{
		v = to[i];
		Sizel(v);
		Size[u] += Size[v];
	}
}
int Calc(const int& v, const int& u)
{
	int Ret = (v > u);
	for (int i = head[v]; i; i = nxt[i])
	{
		Ret += Calc(to[i], u);
	}
	return Ret;
}
void Solve(const int& u)
{
	for (int Half = (Size[u] >> 1), v, i = head[u]; i; i = nxt[i])
	{
		v = to[i];
		Solve(v);
		if ((!(Size[u]&1)) && (Size[v] == Half))
		{
			F[u] = F[u] * F[v] % MOD * Calc(v, u) % MOD;
		}
		else
		{
			F[u] = F[u] * F[v] % MOD * Size[v] % MOD;
		}
	}
}
int main()
{
	scanf("%d", &T);
	while (T--)
	{
		tot = 0;
		scanf("%d%d", &n, &m);
		fill(head, head + n + 1, 0); 
		fill(Deg, Deg + n + 1, 0);
		fill(F, F + n + 1, 1);
		for (R int u, v, i = 1; i <= m; ++i)
		{
			scanf("%d%d", &u, &v);
			add_edge(u, v);
			++Deg[v];
		}
		for (R int i = 1; i <= n; ++i)
		{
			if (!Deg[i])
			{
				Root = i;
				break;
			}
		}
		Sizel(Root);
		Solve(Root);
		printf("%lld\n", F[Root]);
	}
	return 0;
}
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 FASTA格式是生物信息学中一种重要的文本格式,用于表示核酸和氨基酸序列。在该格式中,DNA的四种碱基(腺嘌呤、胸腺嘧啶、胞嘧啶和鸟嘌呤)分别用A、T、C、G表示,而RNA中胸腺嘧啶被尿嘧啶(U)替代。蛋白质序列则用20个单字母代码表示氨基酸,如苯丙氨酸用F表示,酪氨酸用Y表示。许多生物信息学数据库,如DIP和NCBI,都以FASTA格式存储大量生物序列数据供研究者使用。研究者在使用BLAST等序列比对工具后,比对结果也常以FASTA格式呈现。在分析这些序列时,研究者可能需要对特定功能域或功能位点进行研究,例如在蛋白质相互作用预测中,对氨基酸序列进行二联体(连续两个氨基酸)或三联体(连续三个氨基酸)特征编码分析,这有助于了解蛋白质的结构和功能。 为了满足对大型FASTA格式序列文件进行特定长度词条特征分析的需求,本文提出了一种新的算法——压缩索引统计算法。压缩索引是一种高效存储和检索序列数据的数据结构,该算法通过减少存储空间需求和加快查询速度,优化了现有的生物信息学分析工具,这些工具大多缺乏特定长度词条特征分析功能。在FASTA格式文件中,序列的统计是对28个字母的字符串进行的。文件中,序列说明行以“>”开头,后面是描述序列的文字,之后直到下一个“>”开头的说明行之间是序列本身。目前,常见的分析工具如matlab生物信息学工具箱、PexFinder和BLAST等,均未提供特定长度词条特征分析功能。 文章提到的作者初砚硕是生物信息学领域的学者,他在东北林业大学获得计算机应用技术硕士学位,还在大连理工大学分别获得生物工程和计算机应用技术(第二学位)学士学位。通信联系人刘亚秋也具备丰富的研究背景。FASTA格式作为生物信息学研究的基础,简洁地存储了大量核酸和蛋白质序列信息。随着生物信息学
内容概要:本文档《MATLAB 语言从入门到精通:基础语法与实战案例教程》系统介绍了MATLAB的基础知识及其应用。首先概述了MATLAB的定义、核心优势和适用场景,接着详细讲述了MATLAB的安装与界面构成。文档深入浅出地讲解了MATLAB的基础语法,包括变量与数据类型、运算符、流程控制语句、函数定义与调用等。随后,重点介绍了MATLAB的核心数据结构——矩阵与数组的操作,涵盖矩阵创建、向量操作、单元格数组和结构体的使用。绘图与可视化部分展示了如何使用`plot`、`subplot`、`plot3`等函数进行二维和三维图形的绘制。数值计算章节涵盖了线性代数求解、曲线拟合、数值积分和微分方程求解等内容。符号计算部分介绍了符号变量、微积分运算和方程求解。最后,通过一个信号处理与频谱分析的实战案例,演示了MATLAB在实际问题中的应用,并分享了一些高效的编程技巧。; 适合人群:具备一定数学基础的工科学生、科研人员以及对数据分析、算法开发感兴趣的初学者。; 使用场景及目标:①学习MATLAB的基本语法和核心数据结构,掌握矩阵、向量、单元格数组和结构体的操作;②理解并能够应用MATLAB的绘图和可视化功能;③掌握线性代数求解、曲线拟合、数值积分和微分方程求解等数值计算方法;④学会使用符号计算工具进行精确的数学表达式处理;⑤通过实战案例,掌握信号处理与频谱分析的应用技能。; 其他说明:文档提供了丰富的实例和代码片段,帮助读者更好地理解和掌握MATLAB的各项功能。推荐结合官方文档、经典教材和在线课程进行学习,通过大量实践提升应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值