题目描述

Alice和Bob有一棵树(无根、无向),在第i个点上有ai个巧克力。首先,两人个选择一个起点(不同的),获得点上的巧克力;接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都没选过的点并获得点上的巧克力,并且这个点要与自己上一次选的点相邻。当有一人无法操作 时,另一个人可以继续操作,直到不能操作为止。因为Alice和Bob是好朋友,所以他们希望两人得到的巧克力总和尽量大,请输出最大总和。

数据范围

对于20%的数据,n<=15

对于40%的数据,n<=100

对于60%的数据,n<=5000

对于100%的数据,n<=200000,0<=ai<=1000000000(1e9)

=w=

题目模型显然:寻找一棵树上的两条不相交的链使得权值和最大。

树形动态规划。

分两种情况讨论:

1.两条链靠近(存在一条树边,两个端点分居这两条链中);

2.两条链分居一个结点的两颗子树。

易推。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2.out";
const ll inf=0x7fffffff;
const ll maxn=200007,maxm=maxn*2;
ll n,i,j,k,maxx,mxid,ans;
ll a[maxn],fi[maxn],la[maxm],ne[maxm],tot;
ll f[maxn],g[maxn],st[maxn],pre[maxn],spre[maxn],suf[maxn],ssuf[maxn];
ll Pre[maxn],Suf[maxn];
ll h[maxn],h1[maxn];
bool ban[maxn],ok[maxn];
void add_line(ll a,ll b){
tot++;
ne[tot]=fi[a];
la[tot]=b;
fi[a]=tot;
}
void xdfs(ll v,ll from){
ll i,j,k,maxx,smaxx,tmp;
st[0]=0;
for (k=fi[v];k;k=ne[k]) if (la[k]!=from) st[++st[0]]=g[la[k]];
if (from) st[++st[0]]=h1[v];
maxx=smaxx=0;
for (i=1;i<=st[0];i++){
if (maxx<st[i]){
smaxx=maxx;
maxx=st[i];
}else smaxx=max(st[i],smaxx);
pre[i]=maxx;
spre[i]=smaxx;
}
suf[st[0]+1]=ssuf[st[0]+1]=0;
maxx=smaxx=0;
for (i=st[0];i;i--){
if (maxx<st[i]){
smaxx=maxx;
maxx=st[i];
}else smaxx=max(st[i],smaxx);
suf[i]=maxx;
ssuf[i]=smaxx;
}
tmp=0;
for (k=fi[v];k;k=ne[k]) if (la[k]!=from) {
tmp++;
i=max(pre[tmp-1],suf[tmp+1]);
j=max(min(pre[tmp-1],suf[tmp+1]),max(spre[tmp-1],ssuf[tmp+1]));
h1[la[k]]=i+a[v];
h[la[k]]=a[v]+i+j;
}
for (k=fi[v];k;k=ne[k]) if (la[k]!=from) xdfs(la[k],v);
ans=max(ans,h[v]+f[v]);
}
void dfs(ll v,ll from){
ll i,j,k,maxx,smaxx,tmp;
g[v]=a[v];
for (k=fi[v];k;k=ne[k]){
if (la[k]!=from){
dfs(la[k],v);
g[v]=max(g[v],g[la[k]]+a[v]);
f[v]=max(f[v],f[la[k]]);
}
}
st[0]=0;
for (k=fi[v];k;k=ne[k]) if (la[k]!=from) st[++st[0]]=la[k];
maxx=smaxx=0;
for (i=1;i<=st[0];i++){
if (maxx<g[st[i]]){
smaxx=maxx;
maxx=g[st[i]];
}else smaxx=max(g[st[i]],smaxx);
pre[i]=maxx;
spre[i]=smaxx;
Pre[i]=max(Pre[i-1],f[st[i]]);
}
Suf[st[0]+1]=suf[st[0]+1]=ssuf[st[0]+1]=0;
maxx=smaxx=0;
for (i=st[0];i;i--){
if (maxx<g[st[i]]){
smaxx=maxx;
maxx=g[st[i]];
}else smaxx=max(g[st[i]],smaxx);
suf[i]=maxx;
ssuf[i]=smaxx;
Suf[i]=max(Suf[i+1],f[st[i]]);
}
f[v]=max(f[v],maxx+smaxx+a[v]);
tmp=0;
for (k=fi[v];k;k=ne[k])
if (la[k]!=from){
tmp++;
i=max(pre[tmp-1],suf[tmp+1]);
j=max(min(pre[tmp-1],suf[tmp+1]),max(spre[tmp-1],ssuf[tmp+1]));
ans=max(ans,f[la[k]]+i+j+a[v]);
ans=max(ans,f[la[k]]+max(Pre[tmp-1],Suf[tmp+1]));
}
}
int main(){
scanf("%lld",&n);
for (i=1;i<=n;i++) scanf("%lld",&a[i]);
for (i=1;i<n;i++){
scanf("%lld%lld",&j,&k);
add_line(j,k);
add_line(k,j);
}
dfs(1,0);
xdfs(1,0);
printf("%lld",ans);
return 0;
}

=o=

求最大值和次大值,可以维护三大边。

不用像我维护什么前缀最大值,和后缀最大值= =

【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢的更多相关文章

  1. 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)

    前言 本人在此题有一种不是题解的方法,但无法证明也找不到反例. 如果各位大神有反例或证明请发至 邮箱:qq1350742779@163.com Description Alice和Bob有一棵树(无根 ...

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

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

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

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

  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. 【NOIP2017提高组模拟12.24】B

    题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...

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

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

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

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

  8. 【JZOJ4930】【NOIP2017提高组模拟12.18】C

    题目描述 给出一个H的行和W列的网格.第i行第j列的状态是由一个字母的A[i][j]表示,如下: "." 此格为空. "o" 此格包含一个机器人. " ...

  9. 【JZOJ4929】【NOIP2017提高组模拟12.18】B

    题目描述 在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了,保证 ...

随机推荐

  1. [编织消息框架][netty源码分析]3 EventLoop 实现类SingleThreadEventLoop职责与实现

    eventLoop是基于事件系统机制,主要技术由线程池同队列组成,是由生产/消费者模型设计,那么先搞清楚谁是生产者,消费者内容 SingleThreadEventLoop 实现 public abst ...

  2. csp-s模拟测试52平均数,序列题解

    题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数 ...

  3. idea展示runDashboard的窗口

    一.idea的runDashboard打开workspace.xml文件之后,找到component为RunDashboard的节点处,然后在component标签里添加<option name ...

  4. SDF与MDF的区别

    标签: 杂谈   数据库扩展名为.sdf,是一个基于sql server compact edition的数据库文件,不需要安装SQL Server就可以用 基于服务的数据库扩展名为.mdf,是基于S ...

  5. VS2005连接MySQL C API

    1.在属性添加:附加目录,附加依赖库,附加库目录: 2.在stdafx.h中加入: #include <winsock.h> #include "mysql.h" 3. ...

  6. create user

    create创建的用户,只有usage权限,即,连接数据库的权限,最低的权限. # 1.新建用户,这里的用户是由user_name 和ip一起唯一确定一个用户.# 2.若省略ip表达式,则表示%,即所 ...

  7. 主流浏览器HTML5视频格式差异

    因最近在研究video.js,现在遇到的问题是在js中设置了swf,但是在ie8下只是显示黑屏并没有播放视频,在网上进行搜索时查到了有关各个浏览器支持哪些视频格式的文章,现在此记录下,方便以后查阅. ...

  8. vue打包之部署在非根路径下的三两事

    首先,感叹一下,2019年已经过去一半,想想自己做了些什么,好像也没做什么. 今天试着配一个nginx,以前的nginx都是指向的/根路径,今天的nginx指向的非/根路径,遇到许多问题的,总结总结. ...

  9. 为啥Spring和Spring MVC包扫描要分开

    开始学习springmvc各种小白问题 根据例子配置了spring扫描包,但是一直提示404错误,经过大量搜索,发现,扫描包的配置应该写在springmvc的配置文件中,而不是springmvc 配置 ...

  10. Win7下设置WiFi热点

    Win7下设置WiFi热点 今天研究了下Win7设置WIFI热点,Connectify神马的都是浮云~亲測可用,现拿出来分享下~ 1.点击"開始",再点击"执行" ...