结论:最多包含一个 \(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;
}

[COCI2016-2017#1] Mag 结论证明的更多相关文章

  1. Solution -「COCI 2016-2017」 Mag 结论证明

    结论:最多包含一个 \(2\),并且不在链的两端点. 证明:我们问题分成两个 \(\texttt{pass}\). \(\texttt{pass 1}\):\(\forall u,s.t.x_{u}\ ...

  2. 「COCI2016/2017 Contest #2」Bruza

    「COCI2016/2017 Contest #2」Bruza 解题思路 : 首先对于任意时刻 \(i\) ,硬币一定移动到了深度为 \(i\) 的节点,所以第 \(i\) 时刻 Danel 一定染掉 ...

  3. 紫书 习题 8-25 UVa 11175 (结论证明)(配图)

    看了这篇博客https://blog.csdn.net/u013520118/article/details/48032599 但是这篇里面没有写结论的证明, 我来证明一下. 首先结论是对于E图而言, ...

  4. UVA1620 Lazy Susan(结论证明)

    结论: 当 \(n\geq 6\) 时,若 \(n\) 是奇数且输入序列的逆序对数是奇数,则无解,否则有解. 当 \(n=4\) 或 \(n=5\) 时,答案个数及其有限,只有这个环是 \(1\) 到 ...

  5. 关于NIM博弈结论的证明

    关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...

  6. Multi-Nim游戏结论不变证明

    Nim取石子游戏结论: 若n堆石子的异或和为0,则先手必胜:否则,先手必败 加入新规则: 每次取完石子后,可以将取的那一堆的石子 分为多堆,也可以不分 结论: 同Nim取石子游戏结论 证明: 如果异或 ...

  7. 紫书 习题8-10 UVa 1614 (贪心+结论)

    这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...

  8. bjwc Day1 暴力大战

    今天终于有题了... 题目是COCI2016/2017 Round #4 T1一看就是NP问题,k<=50,开始想暴力,想了个n^4的,大概能过,就没去管它 T2想得太naive,丢了100分给 ...

  9. Bash 中的 _ 是不是环境变量

    首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...

随机推荐

  1. ORACLE 数据泵 expdp/impdp

    ORACLE 数据泵 expdp/impdp 一.概念 Oracle Database 10g 引入了最新的数据泵(Data Dump)技术,数据泵导出导入 (EXPDP 和 IMPDP)的作用: 1 ...

  2. ubuntu20.04 编译安装ckermit

    ubuntu20.04编译安装ckermit 我呢之前一直使用的是ubuntu18.04,最近在安装了某个软件之后,再加上自己的操作不当最终导致ubuntu系统卡死无法进入桌面环境,早就想更新20.0 ...

  3. Luogu P4280 [AHOI2008]逆序对

    题目描述 甩个链接就走 题解 先预处理出每个位置上分别填上 1~k 的数的逆序对的数量的前缀和与后缀和 (不用管原来有值的,统计时不计入答案就行了) (有点绕,看代码应该能懂) 然后枚举每个 -1 的 ...

  4. 我用 Python 撸了一个 plist 图集拆图工具!附上github源码

    这些年,我一直在使用 JavaScript .CocosCreator 做开发,只要是他们不能解决的,我都不太愿意去弄,或者说是不太情愿去做.真的是手中有把锤子,看什么都是钉子,越是熟悉一样东西,越容 ...

  5. ETCD核心机制解析

    ETCD整体机制 etcd 是一个分布式的.可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据. etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一 ...

  6. xshell断线解决办法

    困扰了好几个月了,网上更改ssh配置文件.固定ip都不好使,终于找到xshell掉线的解决办法了 哈哈!!! 设备管理器-->网络适配器-->对应网络连接虚拟机方式,本机虚拟机桥接如图 右 ...

  7. ES6--正则表达式

    创建正则表达式规则的四种方法 var regex = new RegExp('xyz', 'i'); var regex = new RegExp(/xyz/i); var regex = new R ...

  8. NoSQL数据库的四大分类的分析

    分类 Examples举例 典型应用场景 数据模型 优点 缺点 键值(key-value) Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB 内容缓 ...

  9. 百度地图省市php获取

    $api = 'http://api.map.baidu.com/shangquan/forward/?qt=sub_area_list&ext=1&level=3&areac ...

  10. 《我想进大厂》之Java基础夺命连环16问

    说好了面试系列已经完结了,结果发现还是真香,嗯,以为我发现我的Java基础都没写,所以这个就算作续集了,续集第一篇请各位收好. 说说进程和线程的区别? 进程是程序的一次执行,是系统进行资源分配和调度的 ...