【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

@ACMLCZH学长出的毒瘤题T3。再也不是“善良”的出题人了。

题意:bzoj

题解:

经典的树形DP题目,屡见不鲜了,然而我还是没有写出来。

这一类的题目有很多,例如这里的C题

主要套路是把对儿子的枚举变成一个类似背包的转移方式,实现降复杂度。

需要注意的是某一个地方的DP值不能直接拿来判断是否有解,例如mod=1时,DP值全为0就没法判断了。

这里比较骚的操作是把mod的倍数变成mod,而0变成0,这样就不会漏判。

#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define eF(i,u) for(int i=h[u];i;i=nxt[i])
#define ll long long
using namespace std;

int n,mod;
ll f[100001][21][3],g[100001][21][3];

int h[100001],nxt[200001],to[200001],tot;
inline void ins(int x,int y){nxt[++tot]=h[x];to[tot]=y;h[x]=tot;}

inline ll M(ll x){return x?(x-1)%mod+1:0;}

void DFS(int u,int fa){
	int cnt=0;
	eF(i,u) if(to[i]!=fa) DFS(to[i],u), ++cnt;
	if(!cnt){
		F(j,0,20) f[u][j][0]=1;
		return;
	}
	F(j,0,20) f[u][j][0]=1;
	eF(i,u) if(to[i]!=fa){
		F(j,0,20){
			g[u][j][0]=M(j?f[u][j][0]*(f[to[i]][j-1][0]+f[to[i]][j-1][1]+f[to[i]][j-1][2]):0);
			g[u][j][1]=M(f[u][j][0]*(f[to[i]][j][0]+f[to[i]][j][1])+(j?f[u][j][1]*(f[to[i]][j-1][0]+f[to[i]][j-1][1]+f[to[i]][j-1][2]):0));
			g[u][j][2]=M(f[u][j][1]*(f[to[i]][j][0]+f[to[i]][j][1])+(j?f[u][j][2]*(f[to[i]][j-1][0]+f[to[i]][j-1][1]+f[to[i]][j-1][2]):0));
			f[u][j][0]=g[u][j][0];
			f[u][j][1]=g[u][j][1];
			f[u][j][2]=g[u][j][2];
		}
	}
}

int main(){
	scanf("%d%d",&n,&mod);
	int x,y; F(i,2,n) scanf("%d%d",&x,&y), ins(x,y), ins(y,x);
	DFS(1,0);
	F(j,0,20)
		if(f[1][j][0]+f[1][j][1]+f[1][j][2]){
			printf("%d\n%lld",j,(f[1][j][0]+f[1][j][1]+f[1][j][2])%mod);
			break;
		}
	return 0;
}

原文地址:https://www.cnblogs.com/PinkRabbit/p/8525356.html

时间: 2024-08-03 09:47:39

【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计的相关文章

bzoj 1064 noi2008 假面舞会题解

莫名其妙的变成了我们的noip互测题... 其实这题思想还是比较简单的,只是分类不好分而已 其实就是一个dfs的事 首先,非常明显,原题目中的所有关系可以抽象成一个图(这是...显而易见的吧...) 接下来,我们仅需在图上讨论即可 当然,这个图有几个部分组成其实并没有那么重要,毕竟,这些部分基本是互不干扰的. 所以接下来我们只需要对每一个块分别处理即可 我们来分类: 首先,如果所有块都是树,我们只需求出每个树上的最长链即可 接下来,如果存在环(包括真实的环和类环,即1-2-3-1和1-2-4+1

【bzoj题解】1012 最大数

题目描述 现在请求你维护一个数列,要求提供以下两种操作:1.查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作.语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾.限制:n是非负整数并且在长整范围内.注意:初始时数列是空的,没有一个数. 输入 第一行两个整数,M和D,其中M表示操作的个数(M <= 200,0

[题解] bzoj 3600 没有人的算数 (替罪羊树+线段树)

- 传送门 - http://www.lydsy.com/JudgeOnline/problem.php?id=3600 - 思路 - 区间操作是线段树无疑,难点在于如何考虑这些数对的大小关系. 我们考虑一下平衡树,如果在平衡树中每个节点放一个数对,我们规定中序遍历前面的数对大于后面的,那么对于任意一个新数对(x,y)插入时只需知道x,y与每个节点的数对的关系,就可以在log的时间内放入. 对于x,y与某节点数对的关系,首先要知道x,y一定在平衡树中存在(否则怎么被用来构成新数对?),因此可以l

[题解]bzoj 1861 Book 书架 - Splay

1861: [Zjoi2006]Book 书架 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1396  Solved: 803[Submit][Status][Discuss] Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引力了,所以她看完后常常会忘记原来是放在书柜的什么位

[题解]bzoj 3223 文艺平衡树

3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3884  Solved: 2235[Submit][Status][Discuss] Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 Input 第一行为n,m n表示初始序列有n个数,这个序列依次

[题解]bzoj 2038 A-小Z的袜子[hose]

作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬.你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子.当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己选择. Input 输入文

bzoj1063【Noi2008】道路设计

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1063 用一种划分方式将树划为重链和轻链,使得所有点到根节点的路径经过的轻链最大值最小 sol:  先判定图是否联通,若不连通输出-1 考虑树形dp,f[i][j]表示以i为根的字树中到i的最大不便利值为j的方案数 然而这时空都是O(n^2)的QAQ,而且没法转移 考虑运用树链剖分的思想可证明,j之多为O(log2(n))的 事实上,j在图为完全二叉树时取最大值O(log3(n)) 对于转移,

NOI 2014简要题解

Day 1.Problem A. 起床困难综合症 100分做法: 把数字看成二进制数.对于初始攻击力,我们将其拆成32位,并求出每一位为0和1时经过所有防御门之后分别得到的数字.然后就是按位贪心了,我们尽量让初始攻击力的高位在经过所有防御门后变成1而不是0,根据这一贪心思想,剩下要做的就是个很简单的数位贪心问题了. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algori

【bzoj题解】2186 莎拉公主的困惑

题目传送门. 题意:求\([1,n!]\)中与\(m!\)互质的数的个数,对质数\(R\)取模,\(n\geq m\). 答案应该等于\(\frac{n!}{m!}\phi(m!)=\frac{n!}{m!}m!\prod_{p|m!}\frac{p-1}{p}=n!\frac{\prod_{p\leq m}\,p-1}{\prod_{p\leq m}\,p}\). 这里\(p\)为小于等于\(m\)的质数. 所以我们处理出阶乘,以及质数的乘积和对\(R\)的逆元就能得出答案. 你真的这么想?