LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP
题目链接:点这里
题解:
需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央。
然后树形DP
设定dp[i][0/1] 以1为根的情况下,以i 节点下子树走分别全1和 走一次2和剩余全走1 的最长链
每遍历一次子树,统计一次答案
下面给出代码
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define ls i<<1 #define rs ls | 1 #define mid ((ll+rr)>>1) #define pii pair<int,int> #define MP make_pair typedef long long LL; const long long INF = 1e18+1LL; const double pi = acos(-1.0); const int N = 5e5+10, M = 1e3+20,inf = 2e9; const LL mod = 1e9+7LL;int n,a[N],ans; int ans1,ans2; vector<int > G[N]; int dp[N][2]; void dfs(int u,int f) {if(a[u] == 1) dp[u][0] = 1;else if(a[u] == 2) dp[u][1] = 1;for(int i = 0; i < G[u].size(); ++i) {int to = G[u][i];if(to == f) continue;dfs(to,u);ans1 = max(ans1,dp[to][0] + dp[u][0]);ans2 = max(ans2,dp[u][0] + dp[to][1]);ans2 = max(ans2,dp[u][1] + dp[to][0]);if(a[u] > 2)continue;if(a[u] == 1) {dp[u][0] = max(dp[u][0],dp[to][0] + 1);dp[u][1] = max(dp[u][1],dp[to][1] + 1);}else {dp[u][1] = max(dp[u][1],dp[to][0] + 1);}} } int main(){scanf("%d",&n);for(int i = 1; i < n; ++i) {int x,y;scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}int mi = inf;for(int i = 1; i <= n; ++i) {scanf("%d",&a[i]);mi = min(mi,a[i]);}ans = 0;dfs(1,0);if(mi >= 2) {printf("%d/1\n",mi);}else {if(2*ans1 > ans2) printf("1/%d\n",ans1);else if(ans2 % 2 == 0) printf("1/%d\n",ans2/2);else printf("2/%d\n",ans2);}return 0; }
转载于:https://www.cnblogs.com/zxhl/p/7295699.html
LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP相关推荐
- LOJ#6085. 「美团 CodeM 资格赛」优惠券(set)
题意 题目链接 Sol 考虑不合法的情况只有两种: 进去了 再次进去 没进去 但是出来了 显然可以用未知记录抵消掉 直接开个set维护一下所有未知记录的位置 最优策略一定是最后一次操作位置的后继 同时 ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- loj 6083.「美团 CodeM 资格赛」数码
题目: 给定两个整数\(l\)和\(r\),对于任意\(x\),满足\(l\leq x\leq r\),把\(x\)所有约数写下来. 对于每个写下来的数,只保留最高位的那个数码.求\([1,9]\)中 ...
- 「美团 CodeM 复赛」城市网络
题目链接 题意分析 首先 \([u,v]\)在树上是一条深度递增的链 那么我们可以使用倍增找 \(x\)的祖先当中深度最大的值大于\(x\)的点 然后维护一个\(pre\) 重新建树 这样从\(x\) ...
- loj 6085.「美团 CodeM 资格赛」优惠券
题目: 一个有门禁的大楼,初始时里面没有人. 现在有一些人在进出大楼,每个人都有一个唯一的编号.现在有他们进出大楼的记录,但是有些被污染了,只能知道这里有一条记录,具体并不能知道. 一个人只有进大楼, ...
- #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队
#6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...
- LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】
「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...
- liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案
#6006. 「网络流 24 题」试题库 题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求试卷 ...
- 2021牛客多校4 - Rebuild Tree(树形dp)
题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...
最新文章
- MIS开发中C/S模式与B/S模式的结合策略
- python编程难吗-都说python很简单 真的很好学么?
- 微信小程序的线程架构
- java 补充日期_Java 9对可选的补充
- android输入自动补全,Android用户输入自动提示控件AutoCompleteTextView使用方法
- liunx 常用操作
- Managing the Activity Lifecycle
- du,df命令和磁盘管理
- mysqld restart service 卡_MySQL数据库之mysqld服务启动失败, Failed to restart mysqld.service: Unit not found....
- 一段仿真PE加载器行为的程序
- Excel如何快速插入行,删除行
- memcached的安装
- cobaltstrike使用和巨龙拉冬9.0
- Playing with ptrace原文
- 【Ubuntu】SMBus Host controller not enabled(虚拟机进入不了图形界面)
- 二叉树遍历(递归、非递归)
- katex常用公式符号一览表
- Python练手小项目(11)用户名密码验证的初步探索
- [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
- 魔兽世界-战士的真谛
热门文章
- Nagios监控之9:利用sendmail使用第三方SMTP服务发送邮件报警
- JAVA程序员面试32问(答案)
- Bit-Scalable Deep Hashing with Regularized Similarity Learning for Image Retrieval and Person Re-ide
- 算法导论之平摊分析(动态表)
- Linux 关于动态链接库以及静态链接库的一些概念
- rockemq 发送延迟消息_RockeMQ通过代码监控消费者状态
- wordpress漏洞_多个WordPress插件SQL注入漏洞分析
- 欧蓝德 (660) -(警车内被乔丹体育)_几款豪华SUV的油耗与空间的巅峰对决!欧蓝德还是奇骏...
- AOP原理-AnnotationAwareAspectJAutoProxyCreator执行时机 || InstantiationAwareBeanPostProcessor
- RenderingHints 参数