求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)
前言
本人在此题有一种不是题解的方法,但无法证明也找不到反例。
如果各位大神有反例或证明请发至
邮箱:qq1350742779@163.com
Description
Alice和Bob有一棵树(无根、无向),在第i个点上有ai个巧克力。首先,两人个选择一个起点(不同的),获得点上的巧克力;接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都没选过的点并获得点上的巧克力,并且这个点要与自己上一次选的点相邻。当有一人无法操作 时,另一个人可以继续操作,直到不能操作为止。因为Alice和Bob是好朋友,所以他们希望两人得到的巧克力总和尽量大,请输出最大总和。
Input
第一行一个整数n,表示树的点数
第二行有n个整数,表示每个点上的巧克力数量ai
接下来n-1行,每行两个整数u、v,表示u和v之间有一条边。
Output
输出一个整数,表示两人能获得得巧克力的最大总和。
Sample Input
9
1 2 3 4 5 6 7 8 9
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
Sample Output
25
Data Constraint
对于20%的数据,n<=15
对于40%的数据,n<=100
对于60%的数据,n<=5000
对于100%的数据,n<=200000,0<=ai<=1000000000(1e9)
我的方法
首先随便找一条直径,然后删掉这些的,在剩下的森林中再找一条最长的链,输出总和。
或者,
首先随便找一条直径,枚举这条直径上的两个点,从这两个点出发分别找到最长链,答案就是这条直径加上从枚举的两个点找到的最长链再减去枚举的两个点在直径之间的路径。
将两者去最大值输出。
#include <cmath>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
const long long maxlongint=2147483647;
const long long mo=1000000007;
const long long N=200005;
using namespace std;
long long n,v[N],next[N*2],last[N*2],to[N*2],tot,ans,mxp,pos,bz[N],s,t,st[N],ts[N],num,ans1,ans2,ans3,ans4,ans5,vv;
long long bj(long long x,long long y)
{
next[++tot]=last[x];
last[x]=tot;
to[tot]=y;
}
long long dg(long long x,long long fa,long long sum)
{
if(sum>ans) ans=sum,mxp=x;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j]==0) dg(j,x,sum+v[j]);
}
}
long long dg1(long long x,long long fa)
{
if(mxp==x && !bz[x]) bz[x]=vv;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j]==0)
{
dg1(j,x);
if(bz[j])
{
bz[x]=vv;
break;
}
}
}
}
long long dg2(long long x,long long fa,long long sum)
{
ans=0;
dg(x,fa,0);
st[++tot]=ans+sum;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j]==vv)
{
dg2(j,x,sum+v[j]);
}
}
}
long long dg3(long long x,long long fa,long long sum)
{
ans=0;
dg(x,fa,0);
ts[tot--]=ans+sum;
for(int i=last[x];i;i=next[i])
{
int j=to[i];
if(j!=fa && bz[j]==vv)
{
dg3(j,x,sum+v[j]);
}
}
}
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;i++) scanf("%lld",&v[i]);
for(long long i=1;i<=n-1;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
bj(x,y);
bj(y,x);
}
vv++;
dg(1,0,v[1]);
pos=mxp;
ans=0;
dg(pos,0,v[pos]);
dg1(pos,0);
s=mxp;
ans=0;
dg(pos,0,v[pos]);
dg1(pos,0);
t=mxp;
tot=0;
dg2(s,0,v[s]);
num=tot;
dg3(t,0,v[t]);
ans1=st[num];
for(int i=1;i<=num;i++) st[i]=max(st[i],st[i-1]);
for(int i=num;i>=1;i--) ts[i]=max(ts[i],ts[i+1]);
ans=0;
for(int i=1;i<=num-1;i++) ans=max(ans,st[i]+ts[i+1]);
ans5=ans;
for(int k=1;k<=n;k++)
if(!bz[k])
{
vv++;
tot=0;
num=0;
ans=0;
dg(k,0,v[k]);
pos=mxp;
ans=0;
dg(pos,0,v[pos]);
dg1(pos,0);
s=mxp;
ans=0;
dg(pos,0,v[pos]);
dg1(pos,0);
t=mxp;
tot=0;
dg2(s,0,v[s]);
num=tot;
ans3=max(ans3,st[num]);
}
printf("%lld",max(ans5,ans1+ans3));
}
求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)的更多相关文章
- 【JZOJ4922】【NOIP2017提高组模拟12.17】环
题目描述 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和 ...
- 【NOIP2017提高组模拟12.17】环
题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...
- 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
题目描述 Alice和Bob有一棵树(无根.无向),在第i个点上有ai个巧克力.首先,两人个选择一个起点(不同的),获得点上的巧克力:接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都 ...
- 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见
题目描述 数据范围 =w= 设h[i]表示,甲队得到i分的方案数. 那么h[(n+k)/2]和h[(n−k)/2]就是答案. 设g[i]表示,甲队得到至少i分的方案数. 那么h[i]=g[i]−∑j& ...
- [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)
题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...
- [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)
题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...
- 【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇
题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 数据范围 对于100%的数 ...
- 【NOIP2017提高组模拟12.10】幻魔皇
题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...
- 【NOIP2017提高组模拟12.10】神炎皇
题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...
随机推荐
- java驼峰法和下划线法字符串的相互转换
java驼峰法和下划线法字符串的相互转换 1 import java.util.regex.Matcher; import java.util.regex.Pattern; public class ...
- SpringBoot常用注解有哪些?
@Service: 注解在类上,表示这是一个业务层bean@Controller: 注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据访问层bean@Comp ...
- appium+python+安卓模拟器环境搭建和启动app实例
本文主要介绍在windows环境下搭建app自动化测试环境,具体步骤如下: 1.下载安卓sdk,网上很多资源 2.下载并安装安卓模拟器,官网上有 删除bin文件下的adb.exe和nox_adb.ex ...
- mysql——单表查询——其它整理示例00
), sname ), sage ), ssex ) ); ','zhaolei','1990-01-01','nan'); ','qiandian','1990-12-21','nan'); ',' ...
- python logger理解
import logging#进行基本的日志配置 logging.basicConfig(filename = 'access.log',format = '%(asctime)s - %(name) ...
- Linux 命令 watch 监测命令的运行结果
watch 命令周期性地执行命令,全屏显示输出命令.watch命令可以监测一个命令的运行结果 命令参数 -n, --interval 设置间隔时间.默认情况下,watch 每隔 2 秒执行一次命令. ...
- [转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解
基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解 不明觉厉 只要是人做的东西 就会有bug 就会有安全问题 就看发现bug 或者是发现安全问题 有没有收益了 会用linux的都是比较熟 ...
- 打印输出opencv的版本信息
本文链接: https://mangoroom.cn/opencv/print-opencv-version-info.html 序 查看自己安装的opencv的版本信息的方法有两种. 方法一-查看l ...
- ps -ef 和ps -aux的区别
在 linux 显示进程的命令是ps ,常用的是 ps -ef,今天看到了还有一个ps -aux,查询了资料,这里总结一下 那么ps -ef 和ps -aux 有什么区别呢? 其实区别不是很大,这就要 ...
- 786B - Legacy(线段树 + 最短路)线段树优化建图
题意: 就是给定一张n nn个点的图,求源点s ss到每个点的单源最短路.这张图共有q组边,连边方式有3种: a→b ,边权为w的单向边:a→[l,r] ,即a到连续区间[l,r]中的每一个点都有一条 ...