结论:最多包含一个 \(2\),并且不在链的两端点。

证明:我们问题分成两个 \(\texttt{pass}\)。

  • \(\texttt{pass 1}\):\(\forall u,s.t.x_{u}\ge2\)。

答案显然为 \(\min\{x_{u}\},u\in V\)。

  • \(\texttt{pass 2}\):\(\exists E'\subset E,s.t.x_{u}=1,u\in E'\wedge x_{v}\ge2,v \in E \setminus E\)。

    • 我们设我们选出的链为大概这样的造型:
\[1\rightarrow1\rightarrow\cdots\rightarrow X\rightarrow1\rightarrow1\cdots
\]

即一堆 \(1\) 中夹了一个 \(X\)。

我们设 \(X\) 左边有 \(l\) 个节点,右边有 \(r\) 个节点。

则价值为整条链 \(\frac{X}{l+r+1}\),左边 \(\frac{1}{l}\),右边 \(\frac{1}{r}\)。

为方便我们这里设 \(l<r\)。

那么左边的价值一定大于右边。

这里假设 \(\frac{1}{r}>\frac{X}{l+r+1}\),则有 \(X<\frac{l+1}{r}+1\),又 \(r\ge l+1\),所以 \(\frac{l+1}{r}\le1\)。(假设反过来可以证伪。

所以有 \(X\le2\)。

又 \(X\neq1\),所以 \(X=2\)。

    • 我们设我们选出的链为大概这样的造型:
\[1\rightarrow1\rightarrow\cdots\rightarrow X\rightarrow1\rightarrow\cdots\rightarrow1\rightarrow Y\rightarrow1\cdots
\]

即一堆 \(1\) 中夹了一个 \(X\) 一个 \(Y\)。

这里我们可以把 \(Y\) 以前当成 \(\texttt{pass 2}\) 的第一个类型,设其共有 \(N\) 个数。

那么假设我们加入 \(Y\) 更优,即有 \(\frac{XY}{N+1}<\frac{X}{N}\),则有 \(NY<N+1\),由于 \(Y\neq1\),所以加入 \(Y\) 是更劣的。

然后此题就很水了。放个代码以供参考。

规定 \(dp[i]\) 表示以 \(i\) 为端点的除 \(i\) 外全为 \(1\) 的串。

\(dp2[i]\) 表示带一个 \(2\) 的 \(dp[i]\)。

\(ans[i]\) 表示过 \(i\) 的最长全 \(1\) 串。

\(ans2[i]\) 表示过 \(i\) 的最长的有一个 \(2\) 且不在端点上,其余全为为 \(1\) 的串。

#include <cstdio>
#include <vector>
#include <cstring>
using namespace std; typedef long long LL;
inline LL Max(LL x, LL y) {return x > y ? x : y;}
inline LL Min(LL x, LL y) {return x < y ? x : y;}
const int MAXN = 1e6 + 5;
const int INF = 0x3f3f3f3f;
const LL INf = 0x7f7f7f7f;
LL w[MAXN];
vector<int> mp[MAXN];
void Add_Edge(int u, int v) {
mp[u].push_back(v);
mp[v].push_back(u);
}
LL gcd(LL x, LL y) {
if(!y)
return x;
return gcd(y, x % y);
} LL dp[MAXN], dp2[MAXN], ans2[MAXN], ans[MAXN];
void dfs(int u, int fa) {
if(w[u] == 1) {
dp[u] = 1;
ans2[u] = 1;
ans[u] = 1;
}
for(int i = 0; i < mp[u].size(); i++) {
int v = mp[u][i];
if(v == fa)
continue;
dfs(v, u);
if(w[u] == 1 || w[u] == 2) {
if(w[u] == 2)
ans2[u] = Max(ans2[u], dp[u] + dp[v]);
if(w[u] == 1) {
ans[u] = Max(ans[u], dp[u] + dp[v]);
ans2[u] = Max(ans2[u], dp[u] + dp2[v]);
ans2[u] = Max(ans2[u], dp2[u] + dp[v]);
}
dp[u] = Max(dp[u], dp[v] + 1);
if(dp2[v] != -1)
dp2[u] = Max(dp2[u], dp2[v] + 1);
}
}
if(w[u] == 2) {
dp2[u] = dp[u];
dp[u] = 0;
}
} int main() {
// freopen("P6287_4.in", "r", stdin);
memset(dp2, -1, sizeof dp2);
int n;
scanf ("%d", &n);
for(int i = 1; i < n; i++) {
int u, v;
scanf ("%d %d", &u, &v);
Add_Edge(u, v);
}
LL mi = INF;
for(int i = 1; i <= n; i++) {
scanf ("%lld", &w[i]);
mi = Min(mi, w[i]);
}
if(mi != 1) {
printf("%d/1\n", mi);
return 0;
}
dfs(1, -1);
LL res = 0;
for(int i = 1; i <= n; i++)
res = Max(res, ans2[i]);
LL x_2 = 2, y_2 = res;
LL t = gcd(x_2, y_2);
// printf("%lld\n", res);
x_2 /= t;
y_2 /= t;
double com2 = x_2 * 1.0 / y_2;
if(!res)
com2 = INf;
res = 0;
for(int i = 1; i <= n; i++)
res = Max(res, ans[i]);
// printf("%lld\n", res);
LL x_1 = 1, y_1 = res;
double com1 = x_1 * 1.0 / y_1;
if(!res)
com1 = INf;
if(com2 > com1)
printf("%lld/%lld", x_1, y_1);
else
printf("%lld/%lld", x_2, y_2);
return 0;
}

Solution -「COCI 2016-2017」 Mag 结论证明的更多相关文章

  1. Solution -「COCI 2014-2015 #2」「洛谷 P6406」Norma

    \(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=i}^n(j-i+1)\min_{k=i}^j\ ...

  2. [LOJ#2327]「清华集训 2017」福若格斯

    [LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...

  3. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  4. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  5. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  6. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

  7. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  8. [LOJ#2330]「清华集训 2017」榕树之心

    [LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...

  9. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

随机推荐

  1. 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异

    壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...

  2. esp8266 esp01s wifi继电器 初步点灯成功!艰难的历程啊,期间差点烧了

    0x00 前言说明 放假这几天,在淘宝买了esp01s,和一个搭配esp01s的wifi继电器准备做一些IOT(物联网)实验,踩了不少的坑,总算是点灯成功了!下面记录一些实验的拍照吧~ 继电器参数说明 ...

  3. 浅尝Spring注解开发_AOP原理及完整过程分析(源码)

    浅尝Spring注解开发_AOP原理及完整过程分析(源码) 浅尝Spring注解开发,基于Spring 4.3.12 分析AOP执行过程及源码,包含AOP注解使用.AOP原理.分析Annotation ...

  4. 超全!华为交换机端口vlan详解~

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 华为交换机和其他品牌的交换机在端口的vlan划分上有一些区别,今天就和大家详细说说华为交换机的 ...

  5. Nacos源码系列—关于服务注册的那些事

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 简介 首先我们在看Nacos源码之前,要 ...

  6. HandlerMethodArgumentResolver 自定义使用

    HandlerMethodArgumentResolver 自定义使用 1.HandlerMethodArgumentResolver 的应用场景 ​ HandlerMethodArgumentRes ...

  7. 那些年你啃过的ConcurrentHashMap

    前言 我是fancy,一个年纪轻轻bug量就累计到3200个的程序员,同事们都夸我一个人养活了整个测试组. 最近迷上了并发编程.并发这玩意怎么说呢,就是你平时工作用不到,一用就用在面试上.这不,又卷起 ...

  8. 是时候使用 YAML 来做配置或数据文件了

    概述 我们做程序,经常需要用到配置信息,回顾一下这么多年的搬砖生涯,我记得用过多种格式的文件来定义配置信息,例如 ini文件,xml文件,或者现在比较流行的 json 文件. 这些年虽然云计算和云原生 ...

  9. 10┃音视频直播系统之 WebRTC 中的数据统计和绘制统计图形

    一.数据统计 在视频直播中,还有一项比较重要,那就是数据监控 比如开发人员需要知道收了多少包.发了多少包.丢了多少包,以及每路流的流量是多少,才能评估出目前用户使用的音视频产品的服务质量是好还是坏 如 ...

  10. 『忘了再学』Shell基础 — 15、环境变量(三)

    目录 1.LANG语系变量介绍 2.如何查看Linux中支持的语系 3.查看当前系统的语系 4.总结 提示: 在Linux系统中,环境变量分为两种.一种是用户自定义的环境变量,另一种是系统自带的环境变 ...