求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:Spring框架3(AOP,SSH集成Demo)
1.AOP: Spring提供了4种实现AOP的方式: 1.经典的基于代理的AOP 2.@AspectJ注解驱动的切面 3.纯POJO切面 4.注入式AspectJ切面 aop.xml: <?x ...
- Python学习之数据库初识
9 数据库 9.1 数据库的初识 数据库是可以独立运行的,并且可以对数据的增删改查提供高效便捷方式的工具. 数据库解决的问题: 解决了操作文件的效率和便捷问题 解决了多个服务同时使用数据时 ...
- python学习之模块-模块(二)
5.2 序列化模块 将一种数据结构转换成一种特殊的序列(字符串或bytes)的过程就叫序列化.这个特殊的序列还可以通过命令反解回原来的数据类型. python中有三种序列化的功能模块: json模 ...
- pip install dal 失败问题
这个问题是我在看一本<Django企业开发实战>运行其中一个项目时遇到的 作为一个自学的python 这种问题挺头疼的 这不是代码逻辑的问题 没法像Debug 一样去找问题 我们能依据的 ...
- 应用安全 - 平台 | 工具 - Centreon Web - 漏洞 - 汇总
简介 产地 法国 用途 监控 分布 CVE-2019-16405 https://thecybergeek.co.uk/cves/2019/09/19/CVEs.html
- ef Migration 的一些基础命令
cmd ci 命令 dotnet ef migrations add NewColum --新增migrations dotnet ef database update--跟新数据库 dotnet e ...
- Akka系列(十):Akka集群之Akka Cluster
前言........... 上一篇文章我们讲了Akka Remote,理解了Akka中的远程通信,其实Akka Cluster可以看成Akka Remote的扩展,由原来的两点变成由多点组成的通信网络 ...
- python 并发编程 同步调用和异步调用 回调函数
提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 from concurrent.future ...
- python 并发编程 多线程 多线程实现并发的套接字通信
进程内会生成一个主线程,让主线程执行server函数,server函数核心是accept(),让主线程干accept的工作, 建立连接,每建立一个连接应该执行通信函数 每建立一个连接就是生成一个子线程 ...
- C语言Ⅰ作业12—学期总结
一.我学到的内容 二.我的收获 作业链接 收获 C语言Ⅰ博客作业01 认识了PTA编程,博客园,Markdown基本语法1,Markdown基本语法2 C语言Ⅰ博客作业02 PTA系统常见问题解答 C ...