链接P1864 [NOI2009]二叉查找树

  • 这题还是蛮难的……是我菜。
  • 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质:
  • 首先不管怎么转,中序遍历是确定的,所以先按照数据值排序,变成序列问题。
  • 其次是父亲的权值比儿子小,但是这是个相对关系,所以对权值离散。
  • 问题变成了对一个中序构造一棵树使得满足\(treap\)的第二条性质。
  • 设\(f_{l,r,v}\)表示区间\(l,r\),最小权值大于等于\(v\)的最小代价,这种状态的好处在于我们可以快速知道一段序列的父亲应该最小要多大才可以,因为父亲的权值是一定小于所有儿子的,所以小于等于\(v\)就可以了。
  • 转移首先有:$$

    f_{l,r,v}=min(f_{l,p-1,v}+f_{p+1,r,v}+K+P);$$
  • 其中\(K\)是一次修改代价,\(P\)是区间和,\(p\)是枚举的父亲。
  • 这里是强制修改当前权值了。
  • 然后如果\(v_p>=v\),有$$f_{l,r,v}=min(f_{l,p-1,vl}+f_{p+1,r,vl}+P);$$
  • 其中\(vl\)是\(p\)点权值。
  • 考虑一下边界即可,注意如果\(l>r\)则\(f_{l,r,v}=0\)
#include<bits/stdc++.h>
#define R register int
#define ll long long
using namespace std;
const int N=100;
int n,len,K,O[N];
ll num[N],f[N][N][N],ans;
struct Qs{int id,vl,pd;}w[N];
int cmpid(const Qs &x,const Qs &y){return x.id<y.id;}
int gi(){
R x=0,k=1;char c=getchar();
while((c<'0'||c>'9')&&c!='-')c=getchar();
if(c=='-')k=-1,c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*k;
}
ll Get(R l,R r,R v){
if(l>r)return 0;
if(f[l][r][v]!=-1)return f[l][r][v];
f[l][r][v]=1e18;ll P=num[r]-num[l-1];
if(l==r){f[l][r][v]=P+((w[l].vl>=v)?0:K);return f[l][r][v];}
for(R p=l;p<=r;++p){
f[l][r][v]=min(f[l][r][v],Get(l,p-1,v)+Get(p+1,r,v)+K+P);
if(w[p].vl>=v)
f[l][r][v]=min(f[l][r][v],Get(l,p-1,w[p].vl)+Get(p+1,r,w[p].vl)+P);
}
return f[l][r][v];
}
int main(){
freopen("s.in","r",stdin);
n=gi(),K=gi(),ans=1e18;
for(R i=1;i<=n;++i)w[i].id=gi();
for(R i=1;i<=n;++i)
w[i].vl=gi(),O[++len]=w[i].vl;
for(R i=1;i<=n;++i)w[i].pd=gi();
sort(w+1,w+n+1,cmpid);
sort(O+1,O+len+1),len=unique(O+1,O+len+1)-O-1;
for(R i=1;i<=n;++i){
w[i].vl=lower_bound(O+1,O+len+1,w[i].vl)-O;
num[i]=num[i-1]+w[i].pd;
}
memset(f,-1,sizeof(f));
for(R i=1;i<=len;++i)ans=min(ans,Get(1,n,i));
printf("%lld\n",ans);
return 0;
}

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

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

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

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

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

  3. Luogu P1864 [NOI2009]二叉查找树

    题目 \(v\)表示权值,\(F\)表示频率. 首先我们显然可以把这个权值离散化. 然后我们想一下,这个东西它是一棵树对吧,但是我们改变权值会引起其树形态的改变,这样很不好做,所以我们考虑把它转化为序 ...

  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. [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp

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

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

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

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

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

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

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

随机推荐

  1. ES6 嵌套数组进行解构

    let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo&qu ...

  2. jQuery .ready()

    https://www.w3schools.com/jquery/event_ready.asp Example Use ready() to make a function available af ...

  3. Ta还没有分享呢,过段时间再来看看吧~ 解决办法

    自己摸索出来的.只能查看以前分享的奥.   找到要查看用户的id号   利用特百度搜索工具实现检索 http://www.tebaidu.com/user--1.html 将红字部分替换为刚才复制的u ...

  4. Elastic Search笔记

    目录 1.简介 2.概念和工具使用 2.1 基本概念 2.2 使用kibana 3.操作索引和数据 2.3 索引 2.4 索引映射到文档 2.5 新增数据 2.6 修改数据 2.7 删除数据 4. 搜 ...

  5. POI读取指定Excel中行与列的数据

    import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import ...

  6. Jenkins持续集成_03_添加测试报告

    前言 Jenkins持续集成自动化测试项目后,可以在控制台输出中查看测试结果,但是这样排查起来往往不够直观.为了更直观的查看测试结果,可以在Jenkins上展示测试报告.测试报告中测试结果情况展示的更 ...

  7. centos7安装配置jdk、tomcat

    centos7安装jdk1.8 1.新建文件夹java,上传文件jdk-8u111-linux-x64.tar.gz到java文件夹 2.解压tar包: tar -zxvf jdk-8u111-lin ...

  8. sql中的sp_helptext、sp_help 、sp_depends

    sp_help:用于显示参数清单和其数据类型. sp_depends:用于显示存储过程依据的对象或者依据存储过程的对象. sp_helptext:用于显示存储过程的定义文本

  9. Billboard 题解 hdu2795

    Billboard 题解 hdu2795 题意 有个广告牌,上面需要依次贴广告,广告的高度均为1,但是宽度不同,每次都想贴在最靠左上的位置,按照顺序进行广告的话,输出每个广告位于广告牌的高度. 解题思 ...

  10. 【题解】Cow Relays

    题目大意   求在一张有\(m\)条边无向连通图中,点\(s\)到点\(t\)的经过\(k\)条边的最短路(\(1 \leq m \leq 100\),\(1 \leq k \leq 10^6\)). ...