JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo
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相关推荐
- JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- 【NOIP2017提高A组集训10.25】摘Galo (树形dp)
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- 【JZOJ 5426】【NOIP2017提高A组集训10.25】摘Galo
Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...
- JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜
Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...
- JZOJ 5425. 【NOIP2017提高A组集训10.25】数论
Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...
- JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜
Description Input 第一行两个整数n;m 表示电子个数和询问个数. 接下来n 行, 每行两个整数x; y 表示vi. 接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两 ...
- 5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
这是一道DP题,然后做的时候发现,DP式子死活推不出来. 题目大意(本人实在是不想复制了呵-- 给出A,B序列 找出他们的最长公共严格递增子序列 明确,这是一道DP 所以设状态fi,jf_{i,j}f ...
- JZOJ5424. 【NOIP2017提高A组集训10.25】凤凰院凶真
题解 题目的意思是求两个序列的最长公共上升子序列. 就此可以联想到求两个序列的最长公共子序列: 设fi,jf_{i,j}表示a序列处理到i,b序列处理j的最长公共子序列, 转移很简单. 现在要满足公共 ...
- 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 ...
最新文章
- 将Java程序作成exe文件的几种方法【转载】
- 漂亮的jQuery tab选项卡插件
- PPP协议体系的实现
- sql记录去重(SQL查询或者删除表中重复记录)
- 今天谈谈COLING2018计算语言学进展
- iNOC产品部--完全数计算
- Poj(1274),二分图匹配
- Linux镜像下载及虚拟机中安装
- Charles抓包工具简单教程
- blogspot博客搬家
- dorado java_dorado事件
- 电力设备巡检解决方案
- 【数据结构】循环链表(circular linked list) 双向链表(doubly linked list)
- 在线QQ客服链接,只添加 qq号
- 快出来:律师免费教你打官司啦!!!
- 购房从银行贷了一笔款d,准备每个月还款额为p,月利率为r,计算多少月能还清。
- acmev2怎么用_lua-resty-acme: ACMEv2 客户端和 Let's Encrypt 证书的自动化管理
- 那天喝酒把胆汁都吐出来了,找了个喝酒不伤身体的方法。。。经常喝酒的童鞋留着用吧...
- 访问控制模型(DAC,MAC,RBAC,ABAC)
- 国家分级保护规范要求解读
热门文章
- 在Ubuntu中安裝Anaconda
- 国产处理器服务器操作系统安装(海之舟服务器操作系统安装说明)
- 关于WiFi和信号图标出现感叹号消除办法
- 乐理知识(和弦相关)
- c语言函数内判断嵌套常见错误,c语言不等于(c语言多个if函数怎么嵌套)
- 食物相克表食物最佳搭配
- RouterOS(ROS)+OpenWRT(LEDE)双软路由奶妈级配置
- SQLSERVER 数据库邮件发送以表格形式发送(存储过程内容发邮件)
- 基于ZYNQ的嵌入式学习笔记四(矩阵键盘实现电子琴)
- http://blog.csdn.net/congcong68/article/details/39256307