求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)= ...
随机推荐
- vsftp新建用户及目录时遇到的坑
1.有关vsftp配置及用户权限设置,请参考: http://blog.sina.com.cn/s/blog_3edc5e2e0102vzv8.html 2.需求:公司另一部门要求单独建一目录,来存在 ...
- Shell编程、part4
本节内容 1. shell函数 2. shell正则表达式 shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直 ...
- 从MAP角度理解神经网络训练过程中的正则化
在前面的文章中,已经介绍了从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化,本次我们从最大后验概率点估计(MAP,maximum a posteriori point estimate)的 ...
- Metinfo4.0 /member/save.php 任意用户密码修改
- C语言作业7
问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://i.cnblogs.com/EditPosts.aspx?opt=1 我在这个课程的目标是 在学好C语言编程的 ...
- hive排错
找出错的那个hive实例,看错误日志: 点下面stdout,找Error
- sqlalchemy query函数可用参数有哪些?
一.模型名 二.模型对象属性 三.聚合函数 下面就分别为大家讲讲query函数这三种参数的用法. 在讲之前,我已经把数据库连接配置.模型,以及添加数据写好了,代码如下: from sqlalchemy ...
- P1399 [NOI2013]快餐店
传送门 基环树的题当然先考虑树上怎么搞,直接求个直径就完事了 现在多了个环,先把非环上的直径(设为 $ans$)和环上节点 $x$ 到叶子的最大距离(设为 $dis[x]$)求出来 考虑到对于某种最优 ...
- 解决:centos配置ssh免密码登录后仍要输入密码
转自https://www.jb51.net/article/121180.htm 第一步:在本机中创建秘钥 1.执行命令:ssh-keygen -t rsa 2.之后一路回车就行啦:会在-(home ...
- 一篇关于for循环的简单题练习,
package practice; public class Practice { public static void main(String[] args) { 7. * ** ...