【题目大意】

已知一个treap上每个节点的键值、权值和访问频率。现在可以修改一些节点的权值(可以修改为实数),需要付出k(k为定制)的额外代价。一个treap的总代价=∑(每个节点的访问频率*深度)+额外代价。

*有趣的结论:键值、权值一旦确定,treap是唯一确定的。

【思路】

首先key值是不会变更的,我们按照key值排序,就是按照中序遍历排序。f[i][j][w]代表由i~j组成的子树且每个点的权值都大于等于w的最小总代价。

枚举区间i、j中作为根的k。如果如果wk>=w,就可以不用改根,fi[l][r][k]=min(fi[l][i-1][wk]+fi[i+1][r][wk]+sm[l~i-1]+sm[i+1~r]);还可以一定改根,fi[l][r][k]=min(fi[l][i-1][k]+fi[i+1][r][k]+kk+sm[l~i-1]+sm[i+1~r])。

注意一下,一开始我的想法是“f[i][j][w]代表由i~j组成的子树且每个点的权值都大于w的最小总代价”,但是我没有看见是可以修改为实数的,所以只能用大于等于。

*关注DP的初始值和顺序,这部分详解见代码注释。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int MAXN=+;
const int INF=0x7fffffff;
struct node
{
int data,weight,frequency;
bool operator < (const node& x) const
{
return data<x.data;
}
}a[MAXN];
int n,K,hash[MAXN];
int f[MAXN][MAXN][MAXN];//f[i][j][w]由i~j组成的子树且每个点的权值都大于等于w的最小总代价 void init()
{
scanf("%d%d",&n,&K);
for (int i=;i<=n;i++) scanf("%d",&a[i].data);
for (int i=;i<=n;i++) scanf("%d",&a[i].weight),hash[i]=a[i].weight;
for (int i=;i<=n;i++) scanf("%d",&a[i].frequency); sort(hash+,hash+n+);
sort(a+,a+n+);
int d=unique(hash+,hash+n+)-(hash+);
for (int i=;i<=n;i++)
{
a[i].weight=lower_bound(hash+,hash+d+,a[i].weight)-hash;
}
for (int i=;i<=n;i++)
a[i].frequency+=a[i-].frequency;//求出前缀和 } void dp()
{
memset(f,0x3f,sizeof(f));
for (int i=;i<=n+;i++)
for (int w=;w<=n;w++) f[i][i-][w]=;
//这个初始化注意一下(!),下方(i=k/j=k)时用到
for (int w=n;w;w--)//根据转移条件,显然w比较大的要先球出来,所以由大到小,放在最外层的循环
for (int i=n;i;i--)
for (int j=i;j<=n;j++)
for (int k=i;k<=j;k++)
{
if (a[k].weight>=w) f[i][j][w]=min(f[i][j][w],f[i][k-][a[k].weight]+f[k+][j][a[k].weight]+(a[j].frequency-a[i-].frequency));
//因为新增根节点后,每个节点的深度都+1,所以要加上访问的频率和
//因为可以取实数,所以后面a[k].weight不需要+1,下面的w也是同理
f[i][j][w]=min(f[i][j][w],f[i][k-][w]+f[k+][j][w]+(a[j].frequency+K-a[i-].frequency));
}
int ans=INF;
for (int i=;i<=n;i++)
ans=min(ans,f[][n][i]);
printf("%d",ans);
} int main()
{
init();
dp();
return ;
}

【DP】BZOJ1564- [NOI2009]二叉查找树(!!)的更多相关文章

  1. [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp

    1564: [NOI2009]二叉查找树 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 879  Solved: 612[Submit][Status] ...

  2. BZOJ1564 NOI2009二叉查找树(区间dp)

    首先按数据值排序,那么连续一段区间的dfs序一定也是连续的. 将权值离散化,设f[i][j][k]为i到j区间内所有点的权值都>=k的最小代价,转移时枚举根考虑是否修改权值即可. #includ ...

  3. [BZOJ1564][NOI2009]二叉查找树(区间DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1564 分析: 首先因为每个点的数据值不变,所以无论树的形态如何变,树的中序遍历肯定不变 ...

  4. bzoj1564: [NOI2009]二叉查找树

    dp. 首先这棵树是一个treap. 权值我们可以改成任意实数,所以权值只表示相互之间的大小关系,可以离散化. 树的中序遍历是肯定确定的. 用f[l][r][w]表示中序遍历为l到r,根的权值必须大于 ...

  5. BZOJ 1564: [NOI2009]二叉查找树( dp )

    树的中序遍历是唯一的. 按照数据值处理出中序遍历后, dp(l, r, v)表示[l, r]组成的树, 树的所有节点的权值≥v的最小代价(离散化权值). 枚举m为根(p表示访问频率): 修改m的权值 ...

  6. bzoj 1564 [NOI2009]二叉查找树 区间DP

    [NOI2009]二叉查找树 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 906  Solved: 630[Submit][Status][Discu ...

  7. P1864 [NOI2009]二叉查找树

    链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...

  8. NOI2009 二叉查找树 【区间dp】

    [NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...

  9. BZOJ 1564 :[NOI2009]二叉查找树(树型DP)

    二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...

  10. 洛谷$P1864\ [NOI2009]$二叉查找树 区间$dp$

    正解:区间$dp$ 解题报告: 传送门$QwQ$ 首先根据二叉查找树的定义可知,数据确定了,这棵树的中序遍历就已经改变了,唯一能改变的就是通过改变权值从而改变结点的深度. 发现这里权值的值没有意义,所 ...

随机推荐

  1. js常见易错点

    原文:http://www.jianshu.com/p/1c77853d4f01 前言 本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函 ...

  2. Django之组合搜索组件(二)--另附simple_tag的创建使用方法

    这次的代码为Django之组合搜索组件(一)的改版,实现的结果和(一)相同,不同的是,这次运用simple_tag方式,使.html程序简化 所以现在就开始编程吧! 首先想使用simple_tag方法 ...

  3. 黑色的cms商城网站后台管理模板——后台

    链接:http://pan.baidu.com/s/1hst6Lbm 密码:9ad7

  4. 导航狗IT周报第十五期(July 8, 2018)

    摘要:Seclists.Org: 微信支付SDK存在XXE漏洞:WordPress 4.9.6存在文件删除漏洞:linux中常用的文件打包/解包与压缩/解压缩命令总结… 安全播报 Seclists.O ...

  5. git服务器的简单搭建

    安装git 安装git,参考:https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git 创建git仓库 使用ro ...

  6. 图解IIS8上解决ASP.Net第一次访问慢的处理

  7. Sublime Text2使用规则

    Sublime Text是我发现的有一好用的编辑器,它不单单只支持 python ,几乎支持目前主流的语言,快捷键丰富,可以极大的提高代码开发效率.Sublime Text 网址:http://www ...

  8. LINUX下解决netstat查看TIME_WAIT状态过多问题(转)

    原文连接:www.itokit.com/2012/0516/73950.html # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSIN ...

  9. jsonpath for js

    /** * @license * JSONPath 0.8.0 - XPath for JSON * * Copyright (c) 2007 Stefan Goessner (goessner.ne ...

  10. 1、CentOS 6 安装GitLab

    1.安装和配置必需的依赖项 在CentOS上将系统防火墙打开HTTP和SSH访问. sudo yum install -y curl policycoreutils-python openssh-se ...