前言

本人在此题有一种不是题解的方法,但无法证明也找不到反例。

如果各位大神有反例或证明请发至

邮箱: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】巧克力狂欢)的更多相关文章

  1. 【JZOJ4922】【NOIP2017提高组模拟12.17】环

    题目描述 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和 ...

  2. 【NOIP2017提高组模拟12.17】环

    题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...

  3. 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢

    题目描述 Alice和Bob有一棵树(无根.无向),在第i个点上有ai个巧克力.首先,两人个选择一个起点(不同的),获得点上的巧克力:接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都 ...

  4. 【JZOJ4924】【NOIP2017提高组模拟12.17】向再见说再见

    题目描述 数据范围 =w= 设h[i]表示,甲队得到i分的方案数. 那么h[(n+k)/2]和h[(n−k)/2]就是答案. 设g[i]表示,甲队得到至少i分的方案数. 那么h[i]=g[i]−∑j& ...

  5. [jzoj 5178] [NOIP2017提高组模拟6.28] So many prefix? 解题报告(KMP+DP)

    题目链接: https://jzoj.net/senior/#main/show/5178 题目: 题解: 我们定义$f[pos]$表示以位置pos为后缀的字符串对答案的贡献,答案就是$\sum_{i ...

  6. [jzoj 5177] [NOIP2017提高组模拟6.28] TRAVEL 解题报告 (二分)

    题目链接: https://jzoj.net/senior/#main/show/5177 题目: 题解: 首先选出的泡泡怪一定是连续的一段 L,R 然后 L 一定属于虫洞左边界中的某一个 R 也同样 ...

  7. 【JZOJ4919】【NOIP2017提高组模拟12.10】神炎皇

    题目描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 数据范围 对于100%的数 ...

  8. 【NOIP2017提高组模拟12.10】幻魔皇

    题目 幻魔皇拉比艾尔很喜欢斐波那契树,他想找到神奇的节点对. 所谓斐波那契树,根是一个白色节点,每个白色节点都有一个黑色节点儿子,而每个黑色节点则有一个白色和一个黑色节点儿子.神奇的节点对则是指白色节 ...

  9. 【NOIP2017提高组模拟12.10】神炎皇

    题目 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对(a,b),若满足a+b<=n且a+b是ab的因子,则成为神奇的数对.请问这样的数对共有多少呢? 分析 设\(gcd(a,b)= ...

随机推荐

  1. Jmeter+TCP\Sockets(8583)报文压力测试

    Jmeter一般被用来测试HTTP协议,我第一次拿来测试socket协议,pos机传输报文为8583,协议属于socket,也是TCP协议的一种,网上有LR怎么测试8583报文,我就研究了一下怎么用J ...

  2. 【计算机视觉】ViBe - a powerful technique for background detection and subtraction in video sequences

    转自:http://blog.csdn.net/stellar0/article/details/8777283 作者:星zai ViBe算法:ViBe - a powerful technique ...

  3. 【VS开发】【图像处理】RGB Bayer Color分析

    RGB Bayer Color分析 Bayer色彩滤波阵列 拜耳色彩滤波阵列(Bayer Color Filter Array,CFA)是非常有名的彩色图片的数字采集格式.色彩滤波器的模式如上图所示, ...

  4. 使用Spring Initializr初始化SpringBoot项目

    虽然SpringBoot CLI消除了不少设置工作,但如果你更倾向于传统的Java项目结构,那你应该看看Spring Initializr. Spring Initializr从本质上来说就是一个we ...

  5. [百度知道]ssm和ssh各自的优势

    https://zhidao.baidu.com/question/875108451824176892.html SSM和SSH不同主要在MVC实现方式,以及ORM持久化方面不同(Hiibernat ...

  6. 浅谈Javascript数据属性与访问器属性

    ES5中对象的属性可以分为‘数据属性’和‘访问器属性’两种. 数据属性一般用于存储数据数值,访问器属性对应的是set/get操作,不能直接存储数据值. 数据属性特性:value.writable.en ...

  7. P1216数字三角形

    这是USACO的一道记忆化搜索题,还记得原来学搜索就是被此所困. 给定n深的数,第i层有i个节点,存储有一个数字,询问从第一层走到最后一层所经过节点上数字和的最大值.我们很容易想到枚举所有路径来计算最 ...

  8. 滑雪(dp或记忆化搜索)

    题意:给你一个二维数组,求最长的递减路线的长度,只能向四个方向延伸. 解法1.dp[i][j]以i.j结尾的最长路线长度.边界:每个数初值为1, 转移:从四周向i.j转移,if(a[i][j]> ...

  9. php 图像处理 抠图,生成背景透明png 图片

    *自定义一个图片等比缩放函数 *@param string $picname 被缩放图片名 *@param string $path 被缩放图片路径 *@param int $maxWidth 图片被 ...

  10. 模板 - 强连通分量 - Kosaraju

    Kosaraju算法 O(n+m) vector<int> s; void dfs1(int u) { vis[u] = true; for (int v : g[u]) if (!vis ...