传送门

Luogu

解题思路

看一眼题面,显然这是一颗 treap ,考虑到这棵 treap 的中序遍历总是不变的,所以我们就先把所有点按照数据值排序,求出 treap 的中序遍历,然后还可以观察到,点的权值并不直接参与答案的计算,所以我们还可以把点的权值离散化(毕竟 \(4e6\) 不是个小数字)。

然后我们就可以愉快的开始 \(\text{DP}\) 了。

由于树的中序遍历始终确定,所以我们很容易想到用区间 \(DP\) 来合并答案。

设 \(dp[l][r][k]\) 表示 \([l,r]\) 这段区间所有点的权值全都大于等于 \(k\) 的最小代价和。

我们可以枚举一个子树的根 \(x\) ,那么转移方程就是:

\(dp[l][r][k] = \min\left\{dp[l][x - 1][k] + dp[x + 1][r][k] + K + sum(l, r)\right\}\)

\(dp[l][r][k] = \min\left\{dp[l][x - 1][v_x] + dp[x + 1][r][v_x] + sum(l, r)\right\}\)

\(v_x\) 表示 \(x\) 的初始权值,\(sum(l, r)\) 表示 \([l, r]\) 这段区间的访问频度之和。

第一个方程表示更改 \(x\) 的权值为 \(k\) ,第二个表示不改。

由于每次向上合并答案时都会加上一遍整个区间的访问频度之和,所以就起到了乘以深度的效果。

一些初始化和小细节就不啰嗦了。

细节注意事项

  • 咕咕咕

参考代码

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <ctime>
  9. #define rg register
  10. using namespace std;
  11. template < typename T > inline void read(T& s) {
  12. s = 0; int f = 0; char c = getchar();
  13. while (!isdigit(c)) f |= (c == '-'), c = getchar();
  14. while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
  15. s = f ? -s : s;
  16. }
  17. typedef long long LL;
  18. const int _ = 70 + 2;
  19. int n, K, X[_], sum[_]; LL dp[_][_][_];
  20. struct node{ int d, v, a; }t[_];
  21. inline bool cmp(const node& x, const node& y) { return x.v < y.v; }
  22. inline bool Cmp(const node& x, const node& y) { return x.d < y.d; }
  23. int main() {
  24. #ifndef ONLINE_JUDGE
  25. freopen("in.in", "r", stdin);
  26. #endif
  27. read(n), read(K);
  28. for (rg int i = 1; i <= n; ++i) read(t[i].d);
  29. for (rg int i = 1; i <= n; ++i) read(t[i].v);
  30. for (rg int i = 1; i <= n; ++i) read(t[i].a);
  31. sort(t + 1, t + n + 1, cmp);
  32. for (rg int i = 1; i <= n; ++i) t[i].v = i;
  33. sort(t + 1, t + n + 1, Cmp);
  34. for (rg int i = 1; i <= n; ++i)
  35. sum[i] = sum[i - 1] + t[i].a;
  36. memset(dp, 0x3f, sizeof dp);
  37. for (rg int k = 1; k <= n; ++k)
  38. for (rg int i = 0; i <= n; ++i)
  39. dp[i + 1][i][k] = 0;
  40. for (rg int i = 1; i <= n; ++i)
  41. for (rg int l = 1, r = l + i - 1; r <= n; ++l, ++r)
  42. for (rg int k = 1; k <= n; ++k)
  43. for (rg int x = l; x <= r; ++x) {
  44. dp[l][r][k] = min(dp[l][r][k], dp[l][x - 1][k] + dp[x + 1][r][k] + K + sum[r] - sum[l - 1]);
  45. int v = t[x].v;
  46. if (v >= k)
  47. dp[l][r][k] = min(dp[l][r][k], dp[l][x - 1][v] + dp[x + 1][r][v] + sum[r] - sum[l - 1]);
  48. }
  49. printf("%lld\n", dp[1][n][1]);
  50. return 0;
  51. }

完结撒花 \(qwq\)

「NOI2009」二叉查找树的更多相关文章

  1. 「NOI2009」植物大战僵尸

    「NOI2009」植物大战僵尸 传送门 这是一道经典的最大权闭合子图问题,可以用最小割解决(不会的可以先自学一下) 具体来说,对于这道题,我们对于两个位置的植物 \(i\) 和 \(j\) ,如果 \ ...

  2. 「福利」Java Swing 编写的可视化算法工程,包含树、图和排序

    之前在整理<学习排序算法,结合这个方法太容易理解了>这篇文章时,发现了一个用 Java Swing 编写的可视化算法工程,真心不错!包含了常用数据结构和算法的动态演示,先来张图感受下: 可 ...

  3. 「 深入浅出 」集合Set

    系列文章 「 深入浅出 」集合List 「 深入浅出 」java集合Collection和Map Set继承自Collection接口,不能包含有重复元素.本篇文章主要讲Set中三个比较重要的实现类: ...

  4. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  5. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  6. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  7. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  8. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  9. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

随机推荐

  1. Spring Boot 定时任务 Quartz 使用教程

    Quartz是一个完全由java编写的开源作业调度框架,他使用非常简单.本章主要讲解 Quartz在Spring Boot 中的使用. 快速集成 Quartz 介绍 Quartz 几个主要技术点 Qu ...

  2. Doc-Compose

    一.安装sudo curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s ...

  3. 吴裕雄--天生自然Numpy库学习笔记:NumPy 矩阵库(Matrix)

    import numpy.matlib import numpy as np print (np.matlib.empty((2,2))) # 填充为随机数据 numpy.matlib.zeros() ...

  4. 临时解决执行 Composer Install 返回 Killed 的问题

    昨天在 Linux 服务器上部署 PHP 项目时遇到了一个问题,系统为 Centos 7 ,1 核 1G 的配置.通过 Git 拉取代码后,由于是基于 Laravel 框架的项目,所以需要使用 Com ...

  5. python脚本监听nginx是否运行

    import sys import time import os import logging from logging.handlers import RotatingFileHandler imp ...

  6. linux Shell(待学)

    2. Shell 2.1 简介 shell脚本执行方式Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务.它类似于 DOS 下的 command 和后来的 cmd ...

  7. linux 镜像备份工具rsnyc

    1.本地拷贝文件nohup rsync -avzh /data/wwwroot/xhprof/* /mnt/xhprof/ &2.更改文件夹名称mv /data/wwwroot/xhprof ...

  8. 「CQOI2016」不同的最小割

    「CQOI2016」不同的最小割 传送门 建出最小割树,把每一个点对的最小割抠出来 \(\text{unique}\) 一下就好了. 参考代码: #include <algorithm> ...

  9. 2019年springmvc面试高频题(java)

    前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季.那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情. 当然,不论选择 ...

  10. UICollectionView特殊布局

    流式http://www.code4app.com/thread-30894-1-1.html 美团http://www.code4app.com/thread-30930-1-1.html 复杂布局 ...