题目

\(v\)表示权值,\(F\)表示频率。

首先我们显然可以把这个权值离散化。

然后我们想一下,这个东西它是一棵树对吧,但是我们改变权值会引起其树形态的改变,这样很不好做,所以我们考虑把它转化为序列上的问题。

我们知道这是一个treap对吧,所以它的中序遍历的数据值是递增的,我们考虑这个性质入手,把所有点按数据值从小到大排序,那么连续一段点在树上显然是一个连通块。

设\(f_{i,j,o}\)表示只考虑\([i,j]\)的点,在所有权值\(\ge o\)的情况下的最小答案。那么我们就可以枚举权值和区间,再枚举这个区间的点构成的树的根进行转移了。

设枚举的根为\(k\),那么我们需要满足区间内其它点的权值都比它大。

转移分为两种:

\(1.(v_k\ge o):f_{i,j,o}=\min(f_{i,j,o},f_{i,k-1,v_k}+f_{k+1,j,v_k}+\sum\limits_{p=i}^j F_p)\)

\(2.f_{i,j,o}=\min(f_{i,j,o},f_{i,k-1,o}+f_{k+1,j,o}+\sum\limits_{p=i}^j F_p+K)\)

#include<bits/stdc++.h>
using namespace std;
const int N=73;
struct node{int x,v,f;}a[N];
int operator<(node a,node b){return a.x<b.x;}
int f[N][N][N],t[N];
int read(){int x;cin>>x;return x;}
void min(int &a,int b){a=a<b? a:b;}
int main()
{
int i,j,k,o,n=read(),K=read();memset(f,63,sizeof f);
for(i=1;i<=n;++i) a[i].x=read();
for(i=1;i<=n;++i) t[i]=a[i].v=read();
for(i=1;i<=n;++i) a[i].f=read();
sort(a+1,a+n+1),sort(t+1,t+n+1);
for(i=1;i<=n;++i) a[i].v=lower_bound(t,t+n+1,a[i].v)-t;
for(i=2;i<=n;++i) a[i].f+=a[i-1].f;
for(i=1;i<=n+1;++i) for(j=0;j<=n;++j) f[i][i-1][j]=0;
for(o=n;~o;--o)
for(i=n;i;--i)
for(j=i;j<=n;++j)
for(k=i;k<=j;++k)
{
if(a[k].v>=o) min(f[i][j][o],f[i][k-1][a[k].v]+f[k+1][j][a[k].v]+a[j].f-a[i-1].f);
min(f[i][j][o],f[i][k-1][o]+f[k+1][j][o]+K+a[j].f-a[i-1].f);
}
cout<<f[1][n][0];
}

Luogu P1864 [NOI2009]二叉查找树的更多相关文章

  1. P1864 [NOI2009]二叉查找树

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

  2. [洛谷P1864] NOI2009 二叉查找树

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

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

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

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

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

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

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

  6. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

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

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

  8. 题解 P1864 【[NOI2009]二叉查找树】

    #include<cstdio> #include<string> #include<cstring> #include<iostream> #incl ...

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

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

随机推荐

  1. linux常用的镜像(centos、kali、redhat等)官方下载地址

    常用的linux版本: Redhat:https://developers.redhat.com/topics/linux/ Centos:https://www.centos.org/downloa ...

  2. 集合比较器报错java.lang.IllegalArgumentException: Comparison method violates its general contract!

    Collections.sort(listMonthlyUsage, new Comparator<MonthlyUsageDto>() { //按照元素从小到大排序 @Override ...

  3. new 做了什么

    var a=function(){ this.che1 = function () { console.log(1) } this.che2 = function () { console.log(2 ...

  4. BZOJ 4653: [Noi2016]区间 双指针 + 线段树

    只要一堆线段有重叠次数大于等于 $m$ 次的位置,那么一定有解 因为重叠 $m$ 次只需 $m$ 个线断,将那些多余的线断排除掉即可 先将区间按照长度从小到大排序,再用 $two-pointer$ 从 ...

  5. 删除操作——str.subString(0,str.length()-1)

    subString是String的一个方法,格式为: public String substring(int beginIndex, int endIndex)  返回一个新字符串,它是此字符串的一个 ...

  6. vector利用swap()函数进行内存的释放

    首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...

  7. 如何查看运行的docker container 的 执行 docker run的命令

    前言 就是我备份了一下 mysql_container, 然后我想启用 新的备份的mysql_container 但是之前的docker run image xxxxxx这些都已经忘记了 我想找一下之 ...

  8. sublime安装完插件后出现的一些问题

    1.安装anaconda后代码前面出现小方框 解决办法:这是由于不符合PEP8代码规范,在空白地方右击,选择anaconda --> autoformat PEP8 Errors ,同时保证导入 ...

  9. (53)LINUX应用编程和网络编程之八Linux网络基础

    3.8.1.网络通信概述 3.8.1.1.从进程间通信说起:网络域套接字socket,网络通信其实就是位于网络中不同主机上面的2个进程之间的通信. 3.8.1.2.网络通信的层次 (1)硬件部分:网卡 ...

  10. [BZOJ2987]Earthquake:类欧几里得算法

    分析 类欧的式子到底是谁推的啊怎么这么神仙啊orz! 简单说一下这道题,题目中的约束条件可以转化为: \[ y \leq \frac{c-ax}{b} \] 有负数怎么办啊?转化一下: \[ y \l ...