[vijos1459]车展

试题描述

遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展。车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台。刚开始每个展台都有一个唯一的高度h[i]。主管已经列好一张单子:
L1 R1
L2 R2

Lm Rm
单子上的(Li,Ri)表示第i次车展将要展出编号从Li到Ri的车。

为了更加美观,展览时需要调整展台的高度,使参展所有展台的高度相等。展台的高度增加或减少1都需花费1秒时间。由于管理员只有一个人,所以只好对每个展台依次操作。每次展览结束后,展台高度自动恢复到初始高度。

请告诉管理员为了举办所有展览,他最少需要花多少时间将展台调整好。

输入

第一行为两个正整数n、m。

第二行共n个非负整数,表示第i辆车展台的高度h[i]。

接下来m行每行2个整数Li、Ri(Li≤Ri)。

输出

一个正整数,调整展台总用时的最小值。

输入示例

  1.  

输出示例

  1.  

数据规模及约定

对于50%的数据 n≤500,m≤1000;
对于80%的数据 n≤1000,m≤100000;
对于100%的数据n≤1000,m≤200000;
答案在2^64以内。

题解

预处理一波。参见[BZOJ1112][POI2008]砖块Klo

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <stack>
  6. #include <vector>
  7. #include <queue>
  8. #include <cstring>
  9. #include <string>
  10. #include <map>
  11. #include <set>
  12. using namespace std;
  13.  
  14. int read() {
  15. int x = 0, f = 1; char c = getchar();
  16. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  17. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  18. return x * f;
  19. }
  20.  
  21. #define maxn 1010
  22. #define LL long long
  23. struct Node {
  24. int r, siz;
  25. LL v, sum;
  26. Node() {}
  27. Node(int _, int __): v(_), r(__) {}
  28. } ns[maxn];
  29. int rt, ToT, fa[maxn], ch[2][maxn];
  30. void maintain(int o) {
  31. ns[o].siz = 1; ns[o].sum = ns[o].v;
  32. for(int i = 0; i < 2; i++) if(ch[i][o])
  33. ns[o].siz += ns[ch[i][o]].siz,
  34. ns[o].sum += ns[ch[i][o]].sum;
  35. return ;
  36. }
  37. void rotate(int u) {
  38. int y = fa[u], z = fa[y], l = 0, r = 1;
  39. if(z) ch[ch[1][z]==y][z] = u;
  40. if(ch[1][y] == u) swap(l, r);
  41. fa[u] = z; fa[y] = u; fa[ch[r][u]] = y;
  42. ch[l][y] = ch[r][u]; ch[r][u] = y;
  43. maintain(y); maintain(u);
  44. return ;
  45. }
  46. void insert(int& o, LL v) {
  47. if(!o) {
  48. ns[o = ++ToT] = Node(v, rand());
  49. return maintain(o);
  50. }
  51. bool d = v > ns[o].v;
  52. insert(ch[d][o], v); fa[ch[d][o]] = o;
  53. if(ns[ch[d][o]].r > ns[o].r) {
  54. int t = ch[d][o];
  55. rotate(t); o = t;
  56. }
  57. return maintain(o);
  58. }
  59. LL Find(int o, int k) {
  60. if(!o) return 0;
  61. int ls = ch[0][o] ? ns[ch[0][o]].siz : 0;
  62. LL lsum = ch[0][o] ? ns[ch[0][o]].sum : 0;
  63. if(k >= ls + 1) return lsum + ns[o].v + Find(ch[1][o], k - ls - 1);
  64. return Find(ch[0][o], k);
  65. }
  66. LL Findn(int o, int k) {
  67. if(!o) return -1;
  68. int ls = ch[0][o] ? ns[ch[0][o]].siz : 0;
  69. if(k == ls + 1) return ns[o].v;
  70. if(k > ls + 1) return Findn(ch[1][o], k - ls - 1);
  71. return Findn(ch[0][o], k);
  72. }
  73.  
  74. LL ans[maxn][maxn], H[maxn];
  75.  
  76. int main() {
  77. int n = read(), q = read();
  78. for(int i = 1; i <= n; i++) H[i] = read();
  79.  
  80. for(int l = 1; l <= n; l++) {
  81. rt = ToT = 0;
  82. memset(fa, 0, sizeof(fa));
  83. memset(ch, 0, sizeof(ch));
  84. for(int r = l; r <= n; r++) {
  85. insert(rt, H[r]);
  86. int k = r - l + 2 >> 1;
  87. LL tmp = Findn(rt, k), sum = Find(rt, k);
  88. ans[l][r] = tmp * k - sum;
  89. k = r - l + 1 - k; sum = ns[rt].sum - sum;
  90. ans[l][r] += sum - tmp * k;
  91. }
  92. }
  93. LL Ans = 0;
  94. while(q--) {
  95. int l = read(), r = read();
  96. Ans += ans[l][r];
  97. }
  98. printf("%lld\n", Ans);
  99.  
  100. return 0;
  101. }

[vijos1459]车展的更多相关文章

  1. Vijos1459 车展 (treap)

    描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已 ...

  2. Vijos1459 车展 (数学)

    描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已 ...

  3. Vijos P1459 车展 treap求任意区间中位数

    描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已 ...

  4. vijos P1459 车展(Treap,中位数)

    P1459车展   描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的 ...

  5. Vijos P1459 车展 (treap 任意区间中位数)

    题面: 描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i] ...

  6. 车展(vijos P1459)

    描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n辆车,从左到右依次编号为1,2,…,n,每辆车都有一个展台.刚开始每个展台都有一个唯一的高度h[i].主管已 ...

  7. vijos P1459车展

    P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park     描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...

  8. Three.js基本 Demo

    对于新手来说,几个简单的例子非常实用,偶然发现几个不错的Demo,分享给大家! Three.js基本 Demo 1.最基本的Hello World:http://stemkoski.github.io ...

  9. nfs:环境搭建

    准备环境 通过VirtualBox创建两台虚拟机client1和client2,这两台虚拟机和物理主机组成一个网络.将物理主机作为NFS的服务端,虚拟机client1和client2作为NFS的客户端 ...

随机推荐

  1. C# 把日期字符串转换为日期类型 (MM大写为月、小写为分钟)

    string dtStr; DateTime dtTime; 尝试把时间字符串转为DateTime格式 if (DateTime.TryParse(dtStr, out dtTime)) { //st ...

  2. centos 7 安装音乐播放器(亲测可用)(转载)

    http://www.cnblogs.com/boyiliushui/p/4530625.html

  3. Python-02-基础

    一.数字 int(有符号整型) Python3可以处理任意大小的整数,当然包括负整数. int = 20 print int long(长整型) Python3中不再区分整型和长整型. float(浮 ...

  4. tfs2012迁移,只用到源代码管理

    背景:在虚拟机里面安装的tfs,后来发觉C盘空间太少了,运行卡,准备重新配置一台虚拟机当做tfs服务器.安装相同版本的tfs.数据库(至少比原来的版本一样或者更高版本,要不附加不了数据库). 1.确保 ...

  5. UCenter创始人密码正确但是登录不了

    UCenter创始人密码正确但是登录不了,没有什么提示,就反复输入密码登录 也进不了......... ================================================ ...

  6. 微信小程序入门正确姿势(一)

    [未经作者本人同意,请勿以任何形式转载] >>>前言 这是 [认真学编程] 系列的 第4篇 文章(微信小程序入门系列),欢迎点赞分享.写留言,这些都是对我最好的支持. 本系列适合有一 ...

  7. Win10升级后回退后无法检测新版本的修复办法

    笔记本原来装的是Win10 10240版本,升级到14393版本后进行了回退.回退后,Win10系统再也检测不到新版本更新了.   解决办法如下: 1.打开注册表:HKEY_LOCAL_MACHINE ...

  8. 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

    前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考 ...

  9. C#基础系列——委托实现简单设计模式

    前言:上一篇介绍了下多线程的相关知识:C#基础系列——多线程的常见用法详解,里面就提到了委托变量.这篇简单介绍下委托的使用.当然啦,园子里面很多介绍委托的文章都会说道:委托和事件的概念就像一道坎,过了 ...

  10. 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。

    来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...