bzoj 1812
什么鬼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的更多相关文章
- BZOJ 1812: [Ioi2005]riv( 树形dp )
树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...
- BZOJ.1812.[IOI2005]Riv 河流(树形背包)
BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...
- IOI 2005/bzoj 1812:riv 河流
Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一 ...
- BZOJ1812 [IOI2005]river
传送门: 很常规的一道树规,转为左儿子右兄弟. 然后$f[node][anc][K]$表示在node节点上,最近的有贡献祖先在anc上,在node的儿子和兄弟上有k个有贡献节点的最优值. 然后得出以下 ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
随机推荐
- nmap 使用总结
nmap 网络探测工具 参考链接: https://nmap.org/man/zh/ http://www.360doc.com/content/18/0127/18/52402560_7255744 ...
- 基于ip的虚拟主机配置——在一台服务器上绑定多个 IP 地址
进入/etc/sysconfig/network-scripts,修改ifcfg-ens33文件 输入 ip addr 查看ip 引用:https://blog.csdn.net/u013887008 ...
- list补充,append()、extend()、insert()、remove()、del()、pop()、分片
1.添加 append(object),是指在列表的末尾添加一个元素. >>> arr = [1,2,'a','你好',[11,22,33]] >>> arr [1 ...
- opencv处理验证码python代码
# -*- coding: utf-8 -*- # @Time : 2019-02-11 09:39 # @Author : cxa # @File : bgr2gry.py # @Software: ...
- php无法连接mysql问题解决方法总结
http://www.163ns.com/zixun/post/5295.html 本文章总结了在php开发中可能会常常碰到的一些php连接不了mysql数据库的一些问题总结与解决方法分享,有 ...
- linux虚拟机网络服务问题
这里说一下我遇到的一个网络问题,前天修改了虚拟机的主机名,重启虚拟机之后,使用新的主机名和IP都可以访问虚拟机,但昨天开启虚拟机之后,宿主机使用主机名和IP都不能访问虚拟机,于是,我通过ifconfi ...
- Nginx负载均衡实例
upstream MyServers{ server 192.168.63.137; server 192.168.63.138; server 192.168.63.140; } server{ l ...
- CF 1138F 超级有意思的一道交互题QVQ
题意 有一张有向图,由一条长度为 T 的链和一个长度为 C 环组成,但是你并不知道 T 和 C 是多少 图的出发点在链的一段,终点在链的另一端,同时终点与一个环相连,大概有点内向树感觉 现在有 10 ...
- bigfile tablespace
背景 这次终于有个linux实际迁移oracle的机会了,之前都是学习实验.想起最早时,都是windows搞oracle,又让我想起多年期一个项目,数据量太大及计算逻辑太复杂,我用存储过程 ...
- 【原创】运维基础之Docker(5)docker部署airflow
部署方式:docker+airflow+mysql+LocalExecutor 使用airflow的docker镜像 https://hub.docker.com/r/puckel/docker-ai ...