[COCI2016-2017#1] Mag 结论证明
结论:最多包含一个 \(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\) 中夹了一个 \(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\) 中夹了一个 \(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 结论证明的更多相关文章
- Solution -「COCI 2016-2017」 Mag 结论证明
结论:最多包含一个 \(2\),并且不在链的两端点. 证明:我们问题分成两个 \(\texttt{pass}\). \(\texttt{pass 1}\):\(\forall u,s.t.x_{u}\ ...
- 「COCI2016/2017 Contest #2」Bruza
「COCI2016/2017 Contest #2」Bruza 解题思路 : 首先对于任意时刻 \(i\) ,硬币一定移动到了深度为 \(i\) 的节点,所以第 \(i\) 时刻 Danel 一定染掉 ...
- 紫书 习题 8-25 UVa 11175 (结论证明)(配图)
看了这篇博客https://blog.csdn.net/u013520118/article/details/48032599 但是这篇里面没有写结论的证明, 我来证明一下. 首先结论是对于E图而言, ...
- UVA1620 Lazy Susan(结论证明)
结论: 当 \(n\geq 6\) 时,若 \(n\) 是奇数且输入序列的逆序对数是奇数,则无解,否则有解. 当 \(n=4\) 或 \(n=5\) 时,答案个数及其有限,只有这个环是 \(1\) 到 ...
- 关于NIM博弈结论的证明
关于NIM博弈结论的证明 NIM博弈:有k(k>=1)堆数量不一定的物品(石子或豆粒…)两人轮流取,每次只能从一堆中取若干数量(小于等于这堆物品的数量)的物品,判定胜负的条件就是,最后一次取得人 ...
- Multi-Nim游戏结论不变证明
Nim取石子游戏结论: 若n堆石子的异或和为0,则先手必胜:否则,先手必败 加入新规则: 每次取完石子后,可以将取的那一堆的石子 分为多堆,也可以不分 结论: 同Nim取石子游戏结论 证明: 如果异或 ...
- 紫书 习题8-10 UVa 1614 (贪心+结论)
这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...
- bjwc Day1 暴力大战
今天终于有题了... 题目是COCI2016/2017 Round #4 T1一看就是NP问题,k<=50,开始想暴力,想了个n^4的,大概能过,就没去管它 T2想得太naive,丢了100分给 ...
- Bash 中的 _ 是不是环境变量
首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...
随机推荐
- AngularJS——ui-router
深究AngularJS--ui-router详解 原创 2016年07月26日 13:45:14 标签: angularjs / ui-router / ui-view 25043 1.配置使用ui- ...
- SpringBoot第三集:热部署与单元测试(2020最新最易懂)
SpringBoot第三集:热部署与单元测试(2020最新最易懂) 有兴趣的可以先参考附录简单了解SpringBoot自动装配流程. 一.SpringBoot开发热部署 项目开发中,你是否也遇到更新配 ...
- Ubuntu下创建apt源
1. 下载所需安装文件 sudo apt-get install soft name 安装并保存安装文件 或者 sudo apt-get source soft name 只下载安装文件 ...
- 看完这篇 final、finally 和 finalize 和面试官扯皮就没问题了
我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 final 是 Java 中的关键字 ...
- 删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles
删除指定路径下指定天数之前(以文件的修改日期为准)的文件:forfiles 代码如下: @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无 ...
- Centos8防火墙设置
1.centos中firewalld与iptables centos7以前的版本默认使用iptables服务进行管理防火墙规则.centos7以及其以上版本默认使用firewalld服务管理防火墙.所 ...
- 美团笔试题_ACM最多队伍
题目: 选择队伍参加ACM比赛,可以选择的人由N+M组成,N代表N个擅长算法的人,M代表M个擅长编程的人,选择要求:每个队伍三个人,每个队伍中至少有一个擅长算法的人,至少有一个擅长编程的人.求可以组成 ...
- Spring Security验证,提示正确的信息
关于Spring Security的使用,之前也整理过一些笔记,但是在提示信息的时候,总感觉还缺点什么?不管是不是前后端分离,我们都希望在登录验证出现错误的时候,能够提示友好的中文信息. 在前后端不分 ...
- vs code远程开发
VS Code如何配置远程开发 你是如何远程开发的?还在使用FTP/SFTP同步文件?那你out了,有了宇宙第一IDE:VS就不需要这么麻烦了,一起学习一下吧. 第一步,安装Remote SSH插件 ...
- Gromacs分子动力学模拟流程概述
Gromacs分子动力学模拟主要可以分为以下几个步骤,不同的体系步骤可能略有不同. 在开始之前,先简单了解一下预平衡: 分子动力学模拟的最终目的是对体系进行抽样,然后计算体系的能量,各种化学键,成分分 ...