博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2681 : 玩游戏2
阅读量:6298 次
发布时间:2019-06-22

本文共 616 字,大约阅读时间需要 2 分钟。

首先若存在多个连通块,那么答案显然是$+\infty$。

否则以$m$为根,每棵子树的根节点都最多只能放一个金币,且这些子树之间互不干扰。

对于一棵父亲为$m$的子树,最优方案下一定可以将子树剖分成若干条祖先到孙子的链,每条链中每个点$x$往上贡献$\lfloor\frac{v[x]}{2}\rfloor$个金币,且不能贡献到其它链上去,因此一条有$k$个点的链最多可以放$2^k-1$个金币。

设$f[i][j]$表示考虑$i$的子树,$i$所在链里有$j$个点时最多能放的金币数,枚举链的接法转移即可。

时间复杂度$O(n^2)$。

 

#include
typedef long long ll;const int N=70;const ll inf=1LL<<50;int n,m,i,j,ed,g[N],v[N<<1],nxt[N<<1];char s[N];ll p[N],f[N][N],h[N],ans;inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}inline void up(ll&a,ll b){ if(b>inf)b=inf; if(a
2000000000)ans=-1; printf("%lld\n",ans); } return 0;}

  

转载地址:http://vxlta.baihongyu.com/

你可能感兴趣的文章
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
solr-4.10.4部署到tomcat6
查看>>