1564: [NOI2009]二叉查找树 - BZOJ
Description

Input

Output
只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值。
Sample Input
4 10
1 2 3 4
1 2 3 4
1 2 3 4
Sample Output
29
HINT
输入的原图是左图,它的访问代价是1×1+2×2+3×3+4×4=30。最佳的修改方案是把输入中的第3个结点的权值改成0,得到右图,访问代价是1×2+2×3+3×1+4×2=19,加上额外修改代价10,一共是29。
感觉莫名其妙的A了
我设的状态是f[l,r,k]表示区间[l,r]的元素权值都大于等于k时的最小访问代价之和
然后枚举某个点作为根
1.这个点的权值<k,那么就花费K改成k,f[l,r,k]=min(f[l,r,k],f[l,x-1,k]+f[x+1,r,k]+s[l,r]+K)
2.这个点权值>=k,那么我们可以不花费,也可以花费K改成k,f[l,r,k]=min(f[l,r,k],f[l,x-1,k]+f[x+1,r,k]+s[l,r]+K,f[l,x-1,v[x]]+f[x+1,r,v[x]]+s[l,r])
const
maxn=;
type
node=record
x,v,c:longint;
flag:boolean;
end;
var
f:array[..maxn,..maxn,..maxn]of longint;
a:array[..maxn]of node;
s:array[..maxn]of longint;
n,p,ans:longint; procedure swap(var x,y:node);
var
t:node;
begin
t:=x;x:=y;y:=t;
end; procedure down(var x:longint;y:longint);
begin
if x>y then x:=y;
end; procedure init;
var
i,j,cnt,min:longint;
begin
read(n,p);
for i:= to n do read(a[i].x);
for i:= to n do read(a[i].v);
for i:= to n do read(a[i].c);
for i:=n downto do
for j:= to i- do
if a[j].x>a[j+].x then swap(a[j],a[j+]);
for i:= to n do s[i]:=s[i-]+a[i].c;
cnt:=;j:=;
while cnt<n do
begin
min:=maxlongint;
for i:= to n do
if a[i].flag=false then down(min,a[i].v);
for i:= to n do
if (a[i].flag=false) and (a[i].v=min) then
begin
inc(cnt);
a[i].flag:=true;
a[i].v:=j;
end;
inc(j);
end;
end; procedure dp;
var
i,j,k,l:longint;
begin
for i:= to n- do
for j:= to n-i do
for k:= to n do
begin
f[j,i+j,k]:=maxlongint;
for l:=j to i+j do
begin
if a[l].v<k then down(f[j,i+j,k],f[j,l-,k]+f[l+,i+j,k]+s[i+j]-s[j-]+p)
else
begin
down(f[j,i+j,k],f[j,l-,k]+f[l+,i+j,k]+s[i+j]-s[j-]+p);
down(f[j,i+j,k],f[j,l-,a[l].v]+f[l+,i+j,a[l].v]+s[i+j]-s[j-]);
end;
end;
end;
ans:=maxlongint;
for i:= to n do down(ans,f[,n,i]);
writeln(ans);
end; begin
init;
dp;
end.
1564: [NOI2009]二叉查找树 - BZOJ的更多相关文章
- BZOJ 1564: [NOI2009]二叉查找树( dp )
树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...
- bzoj 1564 [NOI2009]二叉查找树 区间DP
[NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 906 Solved: 630[Submit][Status][Discu ...
- BZOJ 1564: [NOI2009]二叉查找树
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564 Description Input Output 只有一个数字,即你所能得到的整棵树的访 ...
- bzoj 1564 [NOI2009]二叉查找树(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- P1864 [NOI2009]二叉查找树
链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
- [BZOJ1564][NOI2009]二叉查找树(区间DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1564 分析: 首先因为每个点的数据值不变,所以无论树的形态如何变,树的中序遍历肯定不变 ...
随机推荐
- node中的流程控制中,co,thunkify为什么return callback()可以做到流程控制?
前言 我在学习generator ,yield ,co,thunkify的时候,有许多费解的地方,经过了许多的实践,也慢慢学会用,慢慢的理解,前一阵子有个其他项目的同事过来我们项目组学习node,发现 ...
- 【转】src与href属性的区别
ref:http://www.jb51.net/web/77258.html src和href之间存在区别,能混淆使用.src用于替换当前元素,href用于在当前文档和引用资源之间确立联系. src是 ...
- 根据Ip获取城市帮助类
思路构建 1.先通过本地的测IP地址库进行匹配 2.如果本地IP地址库存在此IP的城市信息,就直接返回,调用速度也快 3.如果本地没有对应的IP城市信息,必须通过调用网络的IP查询的API了,这里我使 ...
- Winform开发常用控件之Checkbox和CheckedListBox
Winform的开发基本都是基于控件事件的,也就是事件驱动型的. 多选框的放置和值的获取有很多种,这里介绍几个简单常用的方法 1.直接放置Checkbox,并获取Checkbox的值 上图 做法也非常 ...
- javascript组件化(转)
javascript组件化(转) By purplebamboo 3月 16 2015 更新日期:3月 23 2015 文章目录 1. 最简陋的写法 2. 作用域隔离 3. 面向对象 4. 抽象出ba ...
- zabbix2.4 安装配置
首先从www.zabbix.com下载rpm包: 接下来我要配置一台zabbix server,自己监控自己即使服务端又是客户端,zabbix web gui和zabbix数据库都放在同一台主机上,除 ...
- PHP 定时任务|Cron
一. Crontab 介绍 crontab命令的功能是在一定的时间间隔调度一些命令的执行.在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序.每个用户可以建立自己的调度cro ...
- LotusPhp中配置文件组件LtConfig详解
LotusPhp中配置文件组件LtConfig是约定的一个重要组成部分,适用于多个场景,多数的LotusPhp组件如数据库,缓存,RBAC,表单验证等都需要用到配置组件,LtConfig配置组件也是L ...
- 搭通自己的电脑与GitHub的传输通道
一.远程仓库怎么玩 1. 自己搭建一个运行Git的服务器 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上,但肯定有一台机器有着最原始的版本库,然后别的机器来克隆这个原始版本库,这 ...
- [转]SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...