【JZOJ4923】巧克力狂欢
来源:互联网 发布:中标数据 编辑:程序博客网 时间:2024/06/02 12:04
Description
Alice和Bob有一棵树(无根、无向),在第i个点上有ai个巧克力。首先,两人个选择一个起点(不同的),获得点上的巧克力;接着两人轮流操作(Alice先),操作的定义是:在树上找一个两人都没选过的点并获得点上的巧克力,并且这个点要与自己上一次选的点相邻。当有一人无法操作 时,另一个人可以继续操作,直到不能操作为止。因为Alice和Bob是好朋友,所以他们希望两人得到的巧克力总和尽量大,请输出最大总和。
Solution
首先,答案要么是在树中找一条最长的直径,去掉直径后再找一条最长的链,要么就是分成的两个链的端点一定包含直径的两端。
证明请读者自行思考。
这里说明一下具体实现:
如下图
答案要么是直径(黑色左右两点)加上剩下的森林中找一条最长链(绿色左右两点)。
要么,就是从直径中选择两个点,删除之间的边(蓝色部分),然后从两点出发分别找一条最长链。
这可以用前缀最大值维护,顺着做一遍即可。
Code
#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define rep(i,x) for(int i=ls[x];i;i=nx[i])#define N 200010#define M 400010#define ll long longusing namespace std;int to[M],nx[M],ls[N],num=0;int a[N],fa[N],b[N];ll s[N],cc[N],z[N];bool bz[N];void link(int x,int y){ num++; to[num]=y; nx[num]=ls[x]; ls[x]=num;}ll ex=0;int c;void dfs(int x,ll t,int tt){ if(ex<t) ex=t,c=x; rep(i,x) { int v=to[i]; if(v!=tt && !bz[v]) dfs(v,t+a[v],x); }}bool tf=true;int st[N];void dg(int x,ll t,int tt){ if(t==ex) { st[++st[0]]=x; return; } rep(i,x) { int v=to[i]; if(v!=tt && !bz[v]) { dg(v,t+a[v],x); if(v==st[st[0]]) { st[++st[0]]=x; return; } } }}ll find(int x){ ex=0;dfs(x,a[x],0); ex=0;dfs(c,a[c],0); st[0]=0; dg(c,a[c],0); fo(i,1,st[0]) bz[st[i]]=true; return ex;}int main(){ int n; scanf("%d",&n); fo(i,1,n) scanf("%d",&a[i]); fo(i,2,n) { int x,y; scanf("%d %d",&x,&y); link(x,y); link(y,x); } ll ans=0,p=find(1); fo(i,1,st[0]) b[++b[0]]=st[i]; fo(i,1,n) if(!bz[i]) ans=max(ans,find(i)+p); // memset(bz,0,sizeof(bz)); fo(i,1,b[0]) bz[b[i]]=true; fo(i,1,b[0]) { s[i]=s[i-1]+a[b[i]]; ex=0; dfs(b[i],0,0); cc[i]=ex; } fo(i,1,b[0]) { z[i]=max(z[i-1],s[i]+cc[i]); ll t=s[b[0]]-s[i]+cc[i+1]; ans=max(ans,z[i]+t); } printf("%lld\n",ans);}
1 0
- 【JZOJ4923】巧克力狂欢
- [JZOJ4923] 巧克力狂欢
- JZOJ4923. 【NOIP2017提高组模拟12.17】巧克力狂欢
- 【JZOJ4923】【NOIP2017提高组模拟12.17】巧克力狂欢
- JZOJ 4923. 巧克力狂欢
- 【NOIP2017提高组模拟12.17】巧克力狂欢
- 【JZOJ 4923】【NOIP2017提高组模拟12.17】巧克力狂欢
- 【JZOJ 4923】 巧克力狂欢 树的直径经典问题
- 求hack or 证明(【JZOJ 4923】 【NOIP2017提高组模拟12.17】巧克力狂欢)
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 巧克力
- 集体狂欢
- 巧克力2
- 巧克力3
- Java中this和super的用法总结
- servlet中每次只能查出最新的值
- The authenticity of host 192.168.0.xxx can't be established. 的问题
- (课堂讨论)关于非功能性需求NFR
- app.use('/',index);app.use('login',login);但当在流浪器中输入路径时登录页面不能正常跳转
- 【JZOJ4923】巧克力狂欢
- maven的安装以及在eclipse的配置和使用
- angular.js生命周期
- 使用阿里云专属加速器加快获取Docker官方镜像的实战
- handler messagequeue looper之间最清楚的讲解
- linux 安装git
- 主机的Hostkey值改变,ssh连接失败
- JVM 学习 第 2 课 虚拟机class文件从哪里寻找?哪里来?
- gazebo官网例程