1564: [NOI2009]二叉查找树 - BZOJ
Description

Input

Output
只有一个数字,即你所能得到的整棵树的访问代价与额外修改代价之和的最小值。
Sample Input
4 10
1 2 3 4
1 2 3 4
1 2 3 4
Sample Output
29
HINT
输入的原图是左图,它的访问代价是1×1+2×2+3×3+4×4=30。最佳的修改方案是把输入中的第3个结点的权值改成0,得到右图,访问代价是1×2+2×3+3×1+4×2=19,加上额外修改代价10,一共是29。
感觉莫名其妙的A了
我设的状态是f[l,r,k]表示区间[l,r]的元素权值都大于等于k时的最小访问代价之和
然后枚举某个点作为根
1.这个点的权值<k,那么就花费K改成k,f[l,r,k]=min(f[l,r,k],f[l,x-1,k]+f[x+1,r,k]+s[l,r]+K)
2.这个点权值>=k,那么我们可以不花费,也可以花费K改成k,f[l,r,k]=min(f[l,r,k],f[l,x-1,k]+f[x+1,r,k]+s[l,r]+K,f[l,x-1,v[x]]+f[x+1,r,v[x]]+s[l,r])
const
maxn=;
type
node=record
x,v,c:longint;
flag:boolean;
end;
var
f:array[..maxn,..maxn,..maxn]of longint;
a:array[..maxn]of node;
s:array[..maxn]of longint;
n,p,ans:longint; procedure swap(var x,y:node);
var
t:node;
begin
t:=x;x:=y;y:=t;
end; procedure down(var x:longint;y:longint);
begin
if x>y then x:=y;
end; procedure init;
var
i,j,cnt,min:longint;
begin
read(n,p);
for i:= to n do read(a[i].x);
for i:= to n do read(a[i].v);
for i:= to n do read(a[i].c);
for i:=n downto do
for j:= to i- do
if a[j].x>a[j+].x then swap(a[j],a[j+]);
for i:= to n do s[i]:=s[i-]+a[i].c;
cnt:=;j:=;
while cnt<n do
begin
min:=maxlongint;
for i:= to n do
if a[i].flag=false then down(min,a[i].v);
for i:= to n do
if (a[i].flag=false) and (a[i].v=min) then
begin
inc(cnt);
a[i].flag:=true;
a[i].v:=j;
end;
inc(j);
end;
end; procedure dp;
var
i,j,k,l:longint;
begin
for i:= to n- do
for j:= to n-i do
for k:= to n do
begin
f[j,i+j,k]:=maxlongint;
for l:=j to i+j do
begin
if a[l].v<k then down(f[j,i+j,k],f[j,l-,k]+f[l+,i+j,k]+s[i+j]-s[j-]+p)
else
begin
down(f[j,i+j,k],f[j,l-,k]+f[l+,i+j,k]+s[i+j]-s[j-]+p);
down(f[j,i+j,k],f[j,l-,a[l].v]+f[l+,i+j,a[l].v]+s[i+j]-s[j-]);
end;
end;
end;
ans:=maxlongint;
for i:= to n do down(ans,f[,n,i]);
writeln(ans);
end; begin
init;
dp;
end.
1564: [NOI2009]二叉查找树 - BZOJ的更多相关文章
- 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 ...
- BZOJ 1564: [NOI2009]二叉查找树
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1564 Description Input Output 只有一个数字,即你所能得到的整棵树的访 ...
- bzoj 1564 [NOI2009]二叉查找树(树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1564 [题意] 给定一个Treap,总代价为深度*距离之和.可以每次以K的代价修改权值 ...
- BZOJ 1564 :[NOI2009]二叉查找树(树型DP)
二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...
- [BZOJ1564][NOI2009]二叉查找树 树形dp 区间dp
1564: [NOI2009]二叉查找树 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 879 Solved: 612[Submit][Status] ...
- P1864 [NOI2009]二叉查找树
链接P1864 [NOI2009]二叉查找树 这题还是蛮难的--是我菜. 题目描述中的一大堆其实就是在描述\(treap.\),考虑\(treap\)的一些性质: 首先不管怎么转,中序遍历是确定的,所 ...
- NOI2009 二叉查找树 【区间dp】
[NOI2009]二叉查找树 [问题描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左子树结点的数据值大,而比它右子树结点的数据值小.另一方面,这棵查找树中每个结点都有 ...
- [BZOJ1564][NOI2009]二叉查找树(区间DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1564 分析: 首先因为每个点的数据值不变,所以无论树的形态如何变,树的中序遍历肯定不变 ...
随机推荐
- 解决DataGridView在多线程中无法显示滚动条的问题
在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的 ...
- C#访问配置文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- MYSQL的存储引擎一般只要哪些?
根据个人个人见解: MySQL的存储引擎(构成.安全.锁) Myisam:数据操作快速的一种引擎,支持全文检索.文件保存在数据库名称为目录名的 目录中,有3个文件,分别是表定义文件(.frm).数据文 ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...
- recurse_array_change_key_case()递规返回字符串键名全为小写或大写的数组
//递归返回字符串键名全为小写或大写的数组function recurse_array_change_key_case(&$input, $case = CASE_LOWER){ if( ...
- 带有×的EditText
代码: EditTextWithDel.java(直接复制): package com.sunday.customs; import com.example.customs.R; import and ...
- 简单Spinner
mainActivity package com.zzw.spinner; import android.app.Activity; import android.content.Context; i ...
- STM32F0xx_GPIO配置详细过程
前言 对于初学STM32的人来说,很多基础的知识没有掌握,这些基础知识就成为阻挡他们入门的门槛.因此,今天也把基础的知识分享出来,带领那些还没有迈过这个门槛的人入门. 今天总结“GPIO配置详细”,以 ...
- Power of Four
Given an integer (signed 32 bits), write a function to check whether it is a power of 4. Example:Giv ...
- ORA-14099 错误解决
DB: 11.2.0.3.0 在测试把普通表修改为交换分区的时候,出现ORA-14099: all rows in table do not qualify for specified partiti ...