P4201-[NOI2008]设计路线【结论,树形dp】
正题
题目链接:https://www.luogu.com.cn/problem/P4201
题目大意
给出nnn个点的一棵树开始所有边都是白色,选出若干条没有公共点的路径将上面所有边变为黑色。
要求所有点到111号点的路径上经过的白色边的数量的最大值最小。
求最小值和方案数
解题思路
直接记录最小值的树形dpdpdp可以计算出第一个答案,但是第二个答案就有点麻烦了,因为有的不取最小值也不一定影响答案。
而可以发现如果按照树链剖分的思路来做答案是不会超过log2n\log_2nlog2n的,进一步证明的话其实可以得到答案不会超过log3n\log_3 nlog3n的结论,因为一个顶部节点实际上是可以延伸出222条路径的。
这样就可以直接dpdpdp了,设fi,j,0/1/2f_{i,j,0/1/2}fi,j,0/1/2表示到节点iii,最大值为jjj,节点iii已经往子树中延伸了0/1/20/1/20/1/2条路径时的方案数。
那么转移起来就很方便了,需要注意答案可能是模数的倍数,所以我们需要另开一个变量来记录每种情况是否有可能。
时间复杂度O(nlog3n)O(n\log_3 n)O(nlog3n)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1e5+10;
struct node{ll to,next;
}a[N<<1];
ll n,m,P,tot,ls[N],f[N][12][3];
bool v[N][12][3];
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dp(ll x,ll fa){for(ll i=1;i<=11;i++)f[x][i][0]=v[x][i][0]=1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==fa)continue;dp(y,x);for(ll j=1;j<=11;j++){ll cho=(f[y][j-1][0]+f[y][j-1][1]+f[y][j-1][2])%P;ll che=(f[y][j][0]+f[y][j][1])%P;ll chv=v[y][j-1][0]|v[y][j-1][1]|v[y][j-1][2];ll chn=v[y][j][0]|v[y][j][1];(f[x][j][2]=f[x][j][1]*che+f[x][j][2]*cho)%=P;(f[x][j][1]=f[x][j][0]*che+f[x][j][1]*cho)%=P; (f[x][j][0]*=cho)%=P;v[x][j][2]=v[x][j][1]&chn|v[x][j][2]&chv;v[x][j][1]=v[x][j][0]&chn|v[x][j][0]&chv; v[x][j][0]&=chv;}}return;
}
signed main()
{scanf("%lld%lld%lld",&n,&m,&P);if(m!=n-1)return printf("-1\n-1")&0;for(ll i=1;i<=m;i++){ll x,y;scanf("%lld%lld",&x,&y);addl(x,y);addl(y,x); }dp(1,1);for(ll i=1;i<=11;i++){ll p=v[1][i][0]|v[1][i][1]|v[1][i][2];if(!p)continue;printf("%lld\n%lld",i-1,(f[1][i][0]+f[1][i][1]+f[1][i][2])%P);break;}return 0;
}
P4201-[NOI2008]设计路线【结论,树形dp】相关推荐
- 算法设计与分析 树形dp
树形dp 概述 题目一:二叉树节点间的最大距离问题 题目二:排队最大快乐值(多叉树问题) 题目三:判断是否为满二叉树 题目四:判断是否为平衡二叉树 题目五:判断是否为二叉排序树 概述 使用前提:如果题 ...
- 【WC2019】数树【子集反演】【结论】【树形dp】【生成函数】【函数求导】【多项式全家桶】
题意:有两棵基于同一点集的树,点集大小为 nnn ,两棵树中有 opopop 棵未确定,可以取所有 nn−2n^{n-2}nn−2 种可能.给每个点染上 [1,y][1,y][1,y] 中的一个颜色, ...
- BZOJ1063:道路设计(树形dp)
1063: [Noi2008]道路设计 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1147 Solved: 619 [ Submit][ ...
- 2020CCPC(秦皇岛) - Kingdom‘s Power(树形dp+贪心)
题目大意:给出一棵 n 个节点的有根树,点 1 为根节点,现在在根节点有无穷多个士兵,每一秒可以控制任意一个士兵向任意一个单位移动一步,士兵移动到的点会被永久占领,现在问最少需要经过多少秒,才能将所有 ...
- bzoj4472: [Jsoi2015]salesman(树形dp)
Description 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收 益.这些净收 ...
- P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)
[八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- codevs1163访问艺术馆(树形dp)
1163 访问艺术馆 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算 ...
- 【bzoj1304】[CQOI2009]叶子的染色 树形dp
题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...
最新文章
- 2022第一位华为“天才少年”来了!绩点1.8逆袭!
- 浏览器下载附件Content-Disposition
- 紫书 习题7-14 UVa 307(暴搜+剪枝)
- [转载]freeSwitch基本操作(转载)
- python【力扣LeetCode算法题库】2-两数相加
- java异常处理学习总结
- boost::basic_thread_pool相关的测试程序
- Tablestore入门手册-UpdateRow接口详解
- 怎么修改腾讯视频账户和密码
- 去掉IE上的 单击以激活和使用此控件 提示
- 连续液位测量行业调研报告 - 市场现状分析与发展前景预测
- http://blog.csdn.net/x86android/article/details/16980967
- 字符串与数组之间的相互转化
- AbiWord 中Piece Table 数据结构的实现----AbiWord Documentation
- 全员系统的服务器地址,江西省全员人口信息系统登录(全员系统查询)
- android cocos 二次启动 崩溃,基于cocos2dx 1.0.1 0.12.0的第二次运行时android...
- 人人都是产品经理2.0
- 计算机磁盘坏道怎么隔离,小科普 | 硬盘坏道就凉凉?把它隔离出去吧!(DLC)...
- PHP中冒号加引号,冒号的五种用法 冒号引号的三种用法
- flatten(扁平化)数组
热门文章
- java map 值排序_使用Java8 Stream API对Map类型按照键或值进行排序
- headless 怎么处理_公司清算注销债务怎么处理
- 爬虫侵入计算机系统,【探讨】利用“爬虫技术”获取数据行为的刑事考量 ——以一起非法获取计算机信息系统数据案为例...
- Java秘技之Json数据解析与转换 -- Java使用示例
- Java交流|面试最后一问:你有什么问题想问我吗?
- linux l显示详细信息,fdisk -l显示信息详解
- python新手入门项目推荐_推荐:一个适合于Python新手的入门练手项目
- linux编译redis打包,linux下下载redis,并且编译
- 新增一个主键自增长_MyBatis 示例-主键回填
- xftp怎么有root权限_许多人都不懂的Linux系统里的特殊权限!!你真的了解嘛?...