Description

0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO。
这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w[i]。
OvO发现,如果她摘下了i号Galo,那么i的子树中的Galo以及i到根的路径上的其他Galo都会死掉。
OvO的袋子只能装k个Galo,她的嘴巴里还能叼1个,请问她所摘Galo的美味度之和的最大值是多少?

Input

第一行两个正整数n,k。
第二行到第n行,第i行两个正整数f[i],w[i],表示i号点的父亲为f[i] (保证x[i]

Output

一行一个非负整数,为最大美味值。

Sample Input

4 1
1 10
2 3
2 6

Sample Output

10

Data Constraint

30% n,k<=200
另30% n*k*k<=10^7
另40% n*k<=10^7
对于所有数据,n,k,w[i]<=10^5

Hint

尽管OvO最多可以摘两个Galo,但是最优情况是只摘下第二个点的Galo,美味度为10。

题解

这是一棵树,自然联想树上的算法。
设fi,jf_{i,j}表示在以i为根节点的子树中,选了j个的最大美味度。

转移有两种情况:
1、第i个点选,那么它子树里面就不能选。fi,1=wif_{i,1}=w_i
2、在子树里面选择,树形背包合并。

但这样的时间复杂度是O(nk2)O(nk^2)

树形dp还有另外一种变型,就是按照dfs序来dp。
记录每一个点的子树大小sis_i
那么fi,jf_{i,j}同样有两种转移
1、由fi+1,jf_{i+1,j},选i的子树。
2、由fi+sdfni,jf_{i+s_{dfn_i},j},就是选了i

code

#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#define ll long long
#define N 100003
#define db double
#define P putchar
#define G getchar
#define mo 998244353
using namespace std;
char ch;
void read(int &n)
{n=0;ch=G();while((ch<'0' || ch>'9') && ch!='-')ch=G();ll w=1;if(ch=='-')w=-1,ch=G();while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();n*=w;
}int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
ll abs(ll x){return x<0?-x:x;}
ll sqr(ll x){return x*x;}
void write(ll x){if(x>9) write(x/10);P(x%10+'0');}
void writeln(ll x){write(x);P('\n');}
int gcd(int x,int y){return y==0?x:gcd(y,x%y);}int n,k,f[N*103],dfn[N],si[N],w[N],ans;
int tot,to[N],b[N],nxt[N],x;void ins(int x,int y)
{nxt[++tot]=b[x];to[tot]=y;b[x]=tot;
}void dfs(int x)
{dfn[++dfn[0]]=x;for(int i=b[x];i;i=nxt[i])dfs(to[i]),si[x]+=si[to[i]];si[x]++;
}int V(int i,int j)
{return (i-1)*(k+1)+j;
}int main()
{freopen("galo.in","r",stdin);freopen("galo.out","w",stdout);read(n);read(k);k++;for(int i=2;i<=n;i++)read(x),read(w[i]),ins(x,i);dfs(1);/*for(int i=n;i;i--)for(int j=1;j<=k;j++)f[i][j]=max(f[i+1][j],f[i+si[dfn[i]]][j-1]+w[dfn[i]]);*/for(int i=n;i;i--)for(int j=1;j<=k;j++)f[V(i,j)]=max(f[V(i+1,j)],f[V(i+si[dfn[i]],j-1)]+w[dfn[i]]);for(int i=1;i<=k;i++)ans=max(ans,f[V(1,i)]);writeln(ans);}

JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo相关推荐

  1. JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  2. 【NOIP2017提高A组集训10.25】摘Galo (树形dp)

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  3. 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  4. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜

    Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...

  5. JZOJ 5425. 【NOIP2017提高A组集训10.25】数论

    Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...

  6. JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜

    Description Input 第一行两个整数n;m 表示电子个数和询问个数. 接下来n 行, 每行两个整数x; y 表示vi. 接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两 ...

  7. 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    这是一道DP题,然后做的时候发现,DP式子死活推不出来. 题目大意(本人实在是不想复制了呵-- 给出A,B序列 找出他们的最长公共严格递增子序列 明确,这是一道DP 所以设状态fi,jf_{i,j}f ...

  8. JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真

    题解 题目的意思是求两个序列的最长公共上升子序列. 就此可以联想到求两个序列的最长公共子序列: 设fi,jf_{i,j}表示a序列处理到i,b序列处理j的最长公共子序列, 转移很简单. 现在要满足公共 ...

  9. JZOJ5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜

    题解 viv_i是一个向量, 那么需要求的就是叉积的平方和. 假设v1=(x1,y1),v2=(x2,y2)v_1=(x_1,y_1),v_2=(x_2,y_2) 那么v1∗v2=x1∗y2−x2∗y ...

最新文章

  1. 将Java程序作成exe文件的几种方法【转载】
  2. 漂亮的jQuery tab选项卡插件
  3. PPP协议体系的实现
  4. sql记录去重(SQL查询或者删除表中重复记录)
  5. 今天谈谈COLING2018计算语言学进展
  6. iNOC产品部--完全数计算
  7. Poj(1274),二分图匹配
  8. Linux镜像下载及虚拟机中安装
  9. Charles抓包工具简单教程
  10. blogspot博客搬家
  11. dorado java_dorado事件
  12. 电力设备巡检解决方案
  13. 【数据结构】循环链表(circular linked list) 双向链表(doubly linked list)
  14. 在线QQ客服链接,只添加 qq号
  15. 快出来:律师免费教你打官司啦!!!
  16. 购房从银行贷了一笔款d,准备每个月还款额为p,月利率为r,计算多少月能还清。
  17. acmev2怎么用_lua-resty-acme: ACMEv2 客户端和 Let's Encrypt 证书的自动化管理
  18. 那天喝酒把胆汁都吐出来了,找了个喝酒不伤身体的方法。。。经常喝酒的童鞋留着用吧...
  19. 访问控制模型(DAC,MAC,RBAC,ABAC)
  20. 国家分级保护规范要求解读

热门文章

  1. 在Ubuntu中安裝Anaconda
  2. 国产处理器服务器操作系统安装(海之舟服务器操作系统安装说明)
  3. 关于WiFi和信号图标出现感叹号消除办法
  4. 乐理知识(和弦相关)
  5. c语言函数内判断嵌套常见错误,c语言不等于(c语言多个if函数怎么嵌套)
  6. 食物相克表食物最佳搭配
  7. RouterOS(ROS)+OpenWRT(LEDE)双软路由奶妈级配置
  8. SQLSERVER 数据库邮件发送以表格形式发送(存储过程内容发邮件)
  9. 基于ZYNQ的嵌入式学习笔记四(矩阵键盘实现电子琴)
  10. http://blog.csdn.net/congcong68/article/details/39256307