CF77C Beavermuncher-0xFF(树形dp)
来源:互联网 发布:2016淘宝年会 马云 编辑:程序博客网 时间:2024/05/17 15:17
这题连写带改了将近一周。。。太弱了。。。很明显是个树形dp,然而细节有点多,蒟蒻认为不太好写。dp[i],表示在i的子树中,先花一个进入i,最后还要回到i,最多能吃多少只。考虑dp[x]如何求出,对于所有儿子y的dp[y],我们贪心的选取,即从大到小排序,先拿大的,再拿小的。要是还能接着拿,看儿子们还有多少剩余,能拿的就是儿子们的剩余与还能拿次数的最小值。注意还有一些回根x而拿掉的1.。。还要注意ll。代码写的丑成一坨,大家凑合看吧。。。
#include <bits/stdc++.h>using namespace std;#define ll long long#define N 100010#define inf 0x3f3f3f3finline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int n,a[N],rt=0,h[N],num=0,fa[N];//dp[i]--先花一个进入i,最后还要回到i,最多能吃多少只ll dp[N];struct edge{ int to,next;}data[N<<1];int dfs(int x){ dp[x]=1;ll res=0;//剩余 vector<ll>f; for(int i=h[x];i;i=data[i].next){ int y=data[i].to;if(y==fa[x]) continue; fa[y]=x;res+=dfs(y);f.push_back(dp[y]); }sort(f.begin(),f.end()); if(x==rt) a[x]++;//根不需要先花一个进入 if(f.size()>=a[x]-1){//不能全拿走 for(int i=1;i<=a[x]-1;++i) dp[x]+=f[f.size()-i]+1;return 0; }for(int i=0;i<f.size();++i) dp[x]+=f[i]+1;a[x]-=f.size();//全拿走 if(a[x]-1>res) return dp[x]+=res*2,a[x]-1-res;//拿剩余 else return dp[x]+=(a[x]-1)*2,0;}int main(){// freopen("a.in","r",stdin); n=read();for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<n;++i){ int x=read(),y=read(); data[++num].to=y;data[num].next=h[x];h[x]=num; data[++num].to=x;data[num].next=h[y];h[y]=num; }rt=read();dfs(rt); printf("%I64d\n",dp[rt]-1); return 0;}
阅读全文
0 0
- CF77C Beavermuncher-0xFF(树形dp)
- Codeforces Beta Round #69 (Div. 1 Only), problem: (C) Beavermuncher-0xFF 树形DP+优先队列
- Codeforces 77C Beavermuncher-0xFF
- Java中0xff的作用(byte&0xff)
- poj1155 (树形dp)
- poj1947(树形dp)
- hdu2196Computer(树形dp)
- poj3107(树形dp)
- CodeForces337D(树形DP)
- hdu1561(树形dp)
- codeforces581f(树形dp)
- hdu4616(树形dp)
- hdu5379(树形dp)
- hdu5379(树形dp)
- hdu3586(树形dp)
- 将功补过(树形dp)
- POJ2342(树形dp)
- poj1463(树形DP)
- UVP开发环境搭建
- android--自定义安全键盘
- c++笔试题
- Learning Spatiotemporal Features with 3D Convolutional Networks (C3D User Guide)
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- CF77C Beavermuncher-0xFF(树形dp)
- hadoop 集群配置入门
- moudule.js:338 throw err; Error: Cannot find module 'webpack/lib/node/NodeTemplatePlugin'
- cocos2dx中lambda表达式几种用法的初步总结
- fatal: You have not concluded your merge (MERGE_HEAD exists).
- Java Security Architecture--Java安全体系技术文档翻译(一)
- 书写简介规范的代码(一)
- Python lxml模块安装教程
- 10.25.2017 考试总结与解题报告