链接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;
}

最新文章

  1. express-session使用理解
  2. http请求相关
  3. ios中常见数据存储方式以及SQLite常用的语句
  4. set集合,是一个无序且不重复的元素集合
  5. UE4 编译后 不能正常使用Open Level 打开关卡解决方案:Open Level Blueprint Node not workin
  6. HDU 2689Sort it 树状数组 逆序对
  7. Tempdb的并发阻塞
  8. jsp页面 列表 展示 ajax异步实现
  9. JDBC连接MySQL数据库
  10. 一个初学者对CLSA.NET框架的使用心得
  11. JavaSE学习总结第24天_多线程2
  12. Windows程序员必须知道的字符编码和字符集
  13. 深入剖析MSAA
  14. Fiddler抓包【3】_设置断点修改
  15. 【CF1141G】Privatization of Roads in Treeland
  16. Response.AddHeader小结
  17. java mqtt
  18. Swift5 语言指南(四) 基础知识
  19. 总结那些有默认margin,padding值的html标签
  20. 解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接

热门文章

  1. Oracle-buffer cache、shared pool
  2. 设计模式-Runoob:设计模式简介
  3. 005-unity3d 添加背景音乐、音效 以及 天空盒子
  4. kafka consumer 自动提交 offset
  5. mkdir: 无法创建目录&quot;kk&quot;: 只读文件系统
  6. Navicat Premium for Mac 非官方版不能启动的解决方案
  7. mysql5.7.23性能调优之innodb_buffer_pool_size
  8. layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)
  9. Spring001--事务的传播机制
  10. 单调栈 &amp;&amp; 洛谷 P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)