标签:

二叉查找树

【题目描述】

已知一棵特殊的二叉查找树。根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小。

另一方面,这棵查找树中每个结点都有一个权值,每个结点的权值都比它的儿子结点的权值要小。

已知树中所有结点的数据值各不相同;所有结点的权值也各不相同。这时可得出这样一个有趣的结论:如果能够确定树中每个结点的数据值和权值,那么树的形态便可以唯一确定。因为这样的一棵树可以看成是按照权值从小到大顺序插入结点所得到的、按照数据值排序的二叉查找树。

一个结点在树中的深度定义为它到树根的距离加1。因此树的根结点的深度为1。

每个结点除了数据值和权值以外,还有一个访问频度。我们定义一个结点在树中的访问代价为它的访问频度乘以它在树中的深度。整棵树的访问代价定义为所有结点在树中的访问代价之和。

现在给定每个结点的数据值、权值和访问频度,你可以根据需要修改某些结点的权值,但每次修改你会付出K的额外修改代价。你可以把结点的权值改为任何实数,但是修改后所有结点的权值必须仍保持互不相同。现在你要解决的问题是,整棵树的访问代价与额外修改代价的和最小是多少?

【输入格式】

输入文件中的第一行为两个正整数N,K。其中:N表示结点的个数,K表示每次修改所需的额外修改代价。

接下来的一行为N个非负整数,表示每个结点的数据值。

再接下来的一行为N个非负整数,表示每个结点的权值。

再接下来的一行为N个非负整数,表示每个结点的访问频度。

其中:所有的数据值、权值、访问频度均不超过400000。每两个数之间都有一个空格分隔,且行尾没有空格。

【输出格式】

输出文件中仅一行为一个数,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值。

【样例输入】

4 10

1 2 3 4

1 2 3 4

1 2 3 4

【样例输出】

29

分析:

参加比赛遇到的题目,比赛时看到题目感觉是用树型dp,但一直没有思路,只好用近似模拟的方法乱搞的,后来看了题解才会做......

首先我们知道该树是一颗特殊的二叉排序树,它比普通的多一个优先级(在本题中就是权值),使它有了堆的性质。如果没有修改操作,我们可以根据这些性质构造一颗这样的树然后模拟,而本题的难度就在修改,对此可以用动规解决。

定义f[i,j,w]为第i..j的节点构成节点权值大于w的子树遍历的最小代价,a[i,1]保存节点的数据值,a[i,2]保存节点离散化后的权值,a[i,3]保存节点的访问频度,s[i,j]为第i..j的节点访问频度之和。

离散化权值,就是将权值按从小到大排序后用其在数组中编号来表示其权值,之所以能这样做是因为节点权值各部相同,而每个点权值数字本身多少没有意义,重要的是它与其它节点权值相比的大小关系,离散化后就可以将大小参差不齐的数字按大小的关系转换为有序的编号,可以节省空间,也可动规中的一些麻烦的东西。

动规式子分两种情况

在i..j中枚举根节点k

若不修改,条件是k的权值>=w,则f[i,j,w]:=max(f[i,j,w],f[i,k-1,a[k,2]]+f[k+1,j,a[k,2]]+s[i,j])

若修改,则f[i,j,w]:=max(f[i,j,w],f[i,k-1,w]+f[k+1,j,w]+s[i,j]+k)

解释:如果不修改,k必须在子树中,其左右孩子权值均要大于k的权值;如果将k修改为根节点,其左右孩子权值可比w大很小很小的一个数字。

代码

program treap;
varf:array[0..100,0..100,0..100]of longint;a:array[1..3,0..100]of longint;s:array[0..100,0..100]of longint;n,i,m,j,w,k:longint;
function min(x,y:longint):longint;
beginif x<y then min:=x else min:=y;
end;
procedure sort(x:longint);
var i,j,t:longint;
beginfor i:=1 to n-1 dofor j:=i+1 to n doif a[x,i]>a[x,j] thenbegint:=a[1,i]; a[1,i]:=a[1,j]; a[1,j]:=t;t:=a[2,i]; a[2,i]:=a[2,j]; a[2,j]:=t;t:=a[3,i]; a[3,i]:=a[3,j]; a[3,j]:=t;end;
end;
beginassign(input,‘treap.in‘);
reset(input);
assign(output,‘treap.out‘);
rewrite(output);readln(n,m);for i:=1 to n doread(a[1,i]); readln;for i:=1 to n doread(a[2,i]); readln;for i:=1 to n doread(a[3,i]);sort(2);for i:=1 to n doa[2,i]:=i;sort(1);for i:=1 to n dofor j:=i to n dos[i,j]:=s[i,j-1]+a[3,j];for i:=1 to n dofor j:=1 to n dofor w:=1 to n dof[i,j,w]:=maxlongint div 10;for i:=1 to n+1 dofor w:=0 to n dof[i,i-1,w]:=0;for w:=n downto 1 dofor i:=n downto 1 dofor j:=i to n dofor k:=i to j doif i=j thenif a[2,k]>=w then f[i,j,w]:=a[3,k] else f[i,j,w]:=a[3,k]+melse beginif a[2,k]>=w then f[i,j,w]:=min(f[i,j,w],f[i,k-1,a[2,k]]+f[k+1,j,a[2,k]]+s[i,j]);f[i,j,w]:=min(f[i,j,w],f[i,k-1,w]+f[k+1,j,w]+s[i,j]+m);end;writeln(f[1,n,1]);close(input); close(output);
end.

【树型DP】BZOJ1564 二叉查找树(noi2009)相关推荐

  1. 其他OJ 树型DP 选课

    在朱全民的PPT介绍的一个树型DP经典题,<选课>,中文题目,不结束 找了很久找到了可以提交的OJ,重庆八中 http://www.cqoi.net:2012/JudgeOnline/pr ...

  2. 【树型DP】加分二叉树

    问题 b: [树型DP]加分二叉树 时间限制: 1 Sec  内存限制: 64 MB 提交: 8  解决: 6 [提交] [状态] [讨论版] [命题人:admin] 题目描述 科技忽略了过程就是魔法 ...

  3. 二叉苹果树(树型DP+背包)

    二叉苹果树 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点).这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号 ...

  4. POJ3342 Party at Hali-Bula(树型DP求最大独立集+唯一解判断)

    题意: 公司参加聚会,要求员工不能和他的上司同时参加,求最多能参加几个人并且判断解是否唯一. 要点: 树型DP的经典题,用dp[u][1]表示选取u的最大值,dp[u][0]表示不选取u的最大值,容易 ...

  5. 虚树+树型DP SDOI2011消耗战

    <虚树+树型DP> SDOI2011消耗战 #include <iostream> #include <cstdio> #include <cstring&g ...

  6. BSOJ 2923:藤原妹红 MST+树型DP

    2923 -- [模拟试题]藤原妹红 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民.由于妹红算得上是幻想乡最强的人类,对于她 ...

  7. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  8. hihocoder 1479 三等分 树型dp

    描述 小Hi最近参加了一场比赛,这场比赛中小Hi被要求将一棵树拆成3份,使得每一份中所有节点的权值和相等. 比赛结束后,小Hi发现虽然大家得到的树几乎一模一样,但是每个人的方法都有所不同.于是小Hi希 ...

  9. 蓝桥杯:生命之树【树型dp】

    之前本菜还没学树型dp的时候,下意识地认为这个东西很难,感觉这个东西结合了搜索+dp这两座算法界的大山必定很难,但万万没想到啊,这个东西很像我之前讲的记忆化搜索,甚至我认为,记忆化搜索的一个作用就是将 ...

最新文章

  1. PhalGo-Request
  2. One Day-XML:XSLT
  3. bigquery按照小时来聚合数据
  4. jmeter+mysql+set_Jmeter中如何进行对数据库压测(上)
  5. http中的净荷 payload(有效载荷、有效负载)是什么?
  6. 使用 QT 时遇到的问题及解决办法
  7. linux下nano修改并保存
  8. oracle impdp导入实例,Oracle数据泵导入导出案例
  9. ubuntu开机报错 system program problem detected
  10. java bootstrapcache_使用ehcache持久化数据到磁盘 并且在应用服务器重启后不丢失数据...
  11. SSLOJ 1351.矩形反色
  12. css文字在图片下方_【HTML+CSS】文字和图片保持同一水平线的三种方式
  13. C++开发工程师进阶路线
  14. 彻底搞定char/wchar_t/unicode
  15. ORVIBO 精灵款升级分析
  16. 鸟与虫(四)pexels搜到的我都想要,
  17. Package XXX is not configured yet
  18. hdmi网线延长器_HDMI单网线延长器HE200使用教程
  19. KKS1(生产订单计算-计算差异)时 常见差异问题
  20. 本科课程【数据结构与算法】实验1——线性表的顺序表示及插入、删除操作(C++实现)

热门文章

  1. 【Android 逆向】Android 进程代码注入原理 ( 进程注入原理 | 远程调用流程 | 获取函数地址 | 设置 IP 寄存器 | mmap 申请内存 | 设置 SP 寄存器 )
  2. 【计算机网络】数据链路层 : 选择重传协议 SR ( 帧分类 | “发送方“ 确认帧、超时事件 | “接受方“ 接收帧机制 | 滑动窗口长度 | 计算示例 )★
  3. 【数据挖掘】基于方格的聚类方法 ( 概念 | STING 方法 | CLIQUE 方法 )
  4. 【Java 网络编程】TCP 服务器端 客户端 简单示例
  5. [web 安全] php随机数安全问题
  6. Office EXCEL 如何为宏命令指定快捷键或者重新设置快捷键
  7. HEAP: Free Heap block XXXX modified at XXXX after it was freed
  8. @import注解使用
  9. 单板计算机倍受欢迎 廉价的ARM计算机能干嘛
  10. Zepto源代码分析之二~三个API