BZOJ 1564: [NOI2009]二叉查找树
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564
Description

Input

Output
Sample Input
1 2 3 4
1 2 3 4
1 2 3 4
Sample Output
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n,j,k1,s[],f[][][];
struct h
{
int x,y,z;
}a[];
bool cmp1(const h&a,const h&b)
{
return (a.y<b.y);
}
bool cmp2(const h&a,const h&b)
{
return (a.x<b.x);
}
int main()
{
scanf("%d %d",&n,&k1);
for (int i=;i<=n;i++) cin>>a[i].x;
for (int i=;i<=n;i++) cin>>a[i].y;
for (int i=;i<=n;i++) cin>>a[i].z;
sort(a+,a++n,cmp1);//按照权值排序
for (int i=;i<=n;i++) a[i].y=i;//进行离散化
sort(a+,a++n,cmp2);//为了符合条件再按照数据值排序
for (int i=;i<=n;i++)
s[i]=s[i-]+a[i].z;//用前缀和把访问频率记录下来,方便计算 for (int i=;i<=n+;i++)
for (int j=;j<=n+;j++)
for (int w=;w<=n+;w++)
f[i][j][w]=;//初始化 for (int i=;i<=n+;i++)
for (int w=;w<=n;w++)
f[i][i-][w]=;//当我们在一个区间中枚举边界i或j为根节点时,我们就会访问到某个f[i][i-1][w],
但其实他是没有左子树或右子树的,所以我们就把它记为0,反正加上去了也没有任何影响。 for (int i=;i<=n;i++)
for (int w=;w<=n;w++)
if (a[i].y>=w) f[i][i][w]=a[i].z;//把本身当做一棵树且这棵树的权值大于等于w时,不必修改。
else f[i][i][w]=a[i].z+k1;//否则就要加上修改的代价 for (int w=n;w>=;w--)
for (int len=;len<=n;len++)
for (int i=;i<=n-len+;i++)//枚举
{
j=i+len-;
for (int k=i;k<=j;k++)
{
if (a[k].y>=w)
f[i][j][w]=min(f[i][j][w],f[i][k-][a[k].y]+f[k+][j][a[k].y]+s[j]-s[i-]);//不需修改时
f[i][j][w]=min(f[i][j][w],f[i][k-][w]+f[k+][j][w]+s[j]-s[i-]+k1); //修改时
}
}
printf("%d",f[][n][]);//因为离散化后节点中权值最小的是1,所以根节点的权值一定是1.
return ;
}
BZOJ 1564: [NOI2009]二叉查找树的更多相关文章
- 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]二叉查找树(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- 1564: [NOI2009]二叉查找树 - BZOJ
Description Input Output只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值.Sample Input4 101 2 3 41 2 3 41 2 3 4Sam ...
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- bzoj 1565 [NOI2009]植物大战僵尸 解题报告
1565: [NOI2009]植物大战僵尸 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2161 Solved: 1000[Submit][Stat ...
- P1864 [NOI2009]二叉查找树
链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
随机推荐
- 用VC进行COM编程所必须掌握的理论知识
一.为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的.结构化编程 ...
- angular中ng-model,返回数据,拆分数据,展示,名称相同,重新赋值会有冲突
本问题出在angular,1.X版本,我用的是1.5的版本: 问题原因: <input type="number" ng-mode="a" /> & ...
- hdu5834
题目让求得是从任意一点出发可以不回来得到的最大的价值 这应该不算特别水的树形dp了,它不止要从上往下dfs,后来海要重新dfs,根据父亲节点更新儿子节点,算是正常的树形dp中比较简单的吧. 思路: 先 ...
- 分支合并git checkout adview git merge adview3
分支合并 git checkout adview git merge adview3
- java 常见dos命令
盘符: 进入指定的盘符下. dir : 列出当前目录下的文件以及文件夹 md : 创建目录 rd : 删除目录 注意:rd不能删除非空的文件夹,而且只能用于删除文件夹. cd : 进入指定目录 ...
- 【NoSql】MongoDb
[NoSql]MongoDb 一. 文档 1. 官网 2. C# Driver 3. C# 开发文档 二. 命令 1. --config "C:\mongodb\mongod.cfg&quo ...
- 【Python全栈笔记】08 [模块二] 20 Oct 递归 -*** 待补充
递归 引入 递归的表现形式 下面是四个函数,互相调用返回结果 # 引入 递归的表现形式 def f1(): ' def f2(): r = f1() return r def f3(): r = f2 ...
- xcode如何将系统语言改为中文,可修改拍照界面retake和use按钮
配置项目本地化支持简体中文和英文 工程-PROJECT-info->Localizations,点"+",选择(Chinese(Simplified))添加简体中文,英文Xc ...
- Oracle学习线路
出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验) 作为oracle的基本功,需要大家对sql和 ...
- 第十周PSP
第十周PSP 工作周期:11.17-11.24 本周PSP: C类型 C内容 S开始时间 ST结束时间 I中断时间 T净时间(分) 文档 写随笔(PSP) 16:20min 16:50min 0 ...