Luogu P1864 [NOI2009]二叉查找树
题目
\(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]二叉查找树的更多相关文章
- P1864 [NOI2009]二叉查找树
链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...
- [洛谷P1864] NOI2009 二叉查找树
问题描述 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结点的权值都比它的 ...
- 洛谷$P1864\ [NOI2009]$二叉查找树 区间$dp$
正解:区间$dp$ 解题报告: 传送门$QwQ$ 首先根据二叉查找树的定义可知,数据确定了,这棵树的中序遍历就已经改变了,唯一能改变的就是通过改变权值从而改变结点的深度. 发现这里权值的值没有意义,所 ...
- 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 ...
- [Luogu 1963] NOI2009 变换序列
[Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- 题解 P1864 【[NOI2009]二叉查找树】
#include<cstdio> #include<string> #include<cstring> #include<iostream> #incl ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
随机推荐
- 21.栈的压入、弹出序列(python)
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压 ...
- docker开启远程tcp监听端口
linux 测试成功 cat > /etc/systemd/system/docker.service.d/tcp.conf <<EOF [Service] ExecStart= E ...
- 51Nod 1433 0和5 (数论 && 被9整除数的特点)
题意 : 小K手中有n(1~1000)张牌, 每张牌上有一个一位数的数, 这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张), 排成一行这样就组成了一个数.使得这个数尽可能大, 而且可以被9 ...
- 文本框——EditText
长度
- [HDU3072]:Intelligence System(塔尖+贪心)
题目传送门 题目描述 “这一切都是命运石之门的选择.”试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮).为了掌握时间机器的技术,SE ...
- [BZOJ1718]:[Usaco2006 Jan] Redundant Paths 分离的路径(塔尖)
题目传送门 题目描述 为了从F个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分 ...
- java跨越请求实例
使用Access-Control-Allow-Origin解决跨域 什么是跨域 当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.google.com),那么我们 ...
- File类 ReadAllBytes() ReadAllLines() ReadAllText()
用 File 类里的 ReadAllLines方法读取文件string[] contents = File.ReadAllLines(@"F:\Users\zhuotu003\Desktop ...
- ORACLE 错误案例—ORA-27102: out of memory
SQL> startupORA-27102: out of memoryLinux-x86_64 Error: 28: No space left on deviceAdditional inf ...
- 1. JDK 、 JRE 、JVM有什么区别和联系?
首先,我们分别对这三者进行阐述. JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机.它只认识 xxx.class 这种类型的文件,它能够将 clas ...