什么鬼noip互测题...

这题很显然是树形dp,但设计状态以及转移是个难点

记状态f[i][j][k]表示以i为根节点的子树,离i最近的祖宗节点编号为j放了虫洞(伐木场?),i的子树内放了k个伐木场的方案数

设to为i的某个子节点,当i不放伐木场时,有:

dp[i][j][k]=min(dp[to][j][k-c]+dp[i][j][c])

当i放伐木场时,有:

dp[i][i][k]=min(dp[to][i][k-c]+dp[i][i]c])

最后合并:

dp[i][j][k]+=num[i]*dis[i][j]

dp[i][j][k]=min(dp[i][j][k],dp[i][i][k])

其中dis[i][j]表示从i到j(j为i的某个祖先节点)的距离,可以预处理出来

特别的,当i为叶节点(即i没有子节点)时,dp[i][j][0]=dis[i][j]*num[i]直接赋值

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#define ll long long
using namespace std;
int dp[][][];
struct Edge
{
int next;
int to;
}edge[];
int head[];
int dis[][];
int num[];
int f[];
int n,k;
int cnt=;
void init()
{
memset(head,-,sizeof(head));
memset(f,-,sizeof(f));
cnt=;
}
void add(int l,int r)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
head[l]=cnt++;
}
void initdfs(int x)
{
if(x)
{
for(int i=f[x];i!=-;i=f[i])
{
dis[x][i]=dis[x][f[x]]+dis[f[x]][i];
}
dis[x][]=dis[x][f[x]]+dis[f[x]][];
}
for(int i=head[x];i!=-;i=edge[i].next)
{
int to=edge[i].to;
initdfs(to);
}
}
void dfs(int x)
{
if(head[x]==-)
{
for(int i=f[x];i!=-;i=f[i])
{
dp[x][i][]=dis[x][i]*num[x];
}
return;
}
if(x)
{
dp[x][x][]=0x3f3f3f3f;
}
for(int i=head[x];i!=-;i=edge[i].next)
{
int to=edge[i].to;
dfs(to);
for(int j=f[x];j!=-;j=f[j])
{
for(int t=k;t>=;t--)
{
int temp=0x3f3f3f3f;
for(int c=;c<=t;c++)
{
temp=min(temp,dp[x][j][c]+dp[to][j][t-c]);
}
dp[x][j][t]=temp;
}
}
for(int j=k;j>=;j--)
{
int temp=0x3f3f3f3f;
for(int c=(x!=);c<=j;c++)
{
temp=min(temp,dp[x][x][c]+dp[to][x][j-c]);
}
dp[x][x][j]=temp;
}
}
for(int i=f[x];i!=-;i=f[i])
{
for(int j=;j<=k;j++)
{
dp[x][i][j]+=dis[x][i]*num[x];
dp[x][i][j]=min(dp[x][i][j],dp[x][x][j]);
}
}
}
inline int read()
{
int f=,x=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
// freopen("girls.in","r",stdin);
// freopen("girls.out","w",stdout);
n=read(),k=read();
init();
f[]=-;
for(int i=;i<=n;i++)
{
int v;
num[i]=read(),f[i]=read(),v=read();
dis[i][f[i]]=v;
add(f[i],i);
}
initdfs();
dfs();
printf("%d\n",dp[][][k]);
return ;
}

bzoj 1812的更多相关文章

  1. BZOJ 1812: [Ioi2005]riv( 树形dp )

    树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...

  2. BZOJ.1812.[IOI2005]Riv 河流(树形背包)

    BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...

  3. IOI 2005/bzoj 1812:riv 河流

    Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一 ...

  4. BZOJ1812 [IOI2005]river

    传送门: 很常规的一道树规,转为左儿子右兄弟. 然后$f[node][anc][K]$表示在node节点上,最近的有贡献祖先在anc上,在node的儿子和兄弟上有k个有贡献节点的最优值. 然后得出以下 ...

  5. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  6. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  7. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  8. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  9. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

随机推荐

  1. CentOS7 设置主机名及IP映射

    1.设置主机名 查看本机的主机名,使用如下三个命令中任意一个即可 # hostname # uname -n # cat /proc/sys/kernel/hostname 使用 vi 编辑器打开 / ...

  2. protobuf 安装与卸载

    方法一:可以FQ 安装 下载https://github.com/google/protobuf/releases ##Source code (zip)## ./autogen.sh ./confi ...

  3. SpringCloud Hystrix

    ⒈Hystrix是什么? Hystrix使一个用于处理分布式系统的延迟和容错的开源库.在分布式系统里,许多依赖不可避免的因服务超时.服务异常等导致调用失败,Hystrix能够保证在一个依赖出现问题的情 ...

  4. Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】

    转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...

  5. 两种 AuthorizationSchemes 在 ASP.NET Core 2

    Welcome to IdentityServer4:  https://identityserver4.readthedocs.io/en/release/   支持 ASP.NET Core 2 ...

  6. DFS不怂之《leetcode-岛屿的个数》

    leetcode刷到这道题: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均 ...

  7. Memcached技术

    Memcached技术 介绍: memcached是一种缓存技术, 他可以把你的数据放入内存,从而通过内存访问提速,因为内存最快的, memcached技术的主要目的提速, 在memachec 中维护 ...

  8. 【转】Java内部类详解

    一.内部类基础 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.广泛意义上的内部类一般来说包括这四种:成员内部类.局部内部类.匿名内部类和静态内部类.下面就先来了解一 ...

  9. 【转】Java的接口和抽象类

    对于面向对象编程来说,抽象是它的一大特征.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有很多相似的地方,又有很多不同的地方. 一.抽象类 在了解抽象类之前,先来了解一下抽象方 ...

  10. $Django 路飞之课程下的分类,用户登陆成功前端存cookie,

    一 课程分类显示 宗旨:总的再次过滤 二 Cookie # export default new Vuex.Store({ state: { name:'', token:'', }, mutatio ...