[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

试题描述

输入

见“试题描述

输出

见“试题描述

输入示例

见“试题描述

输出示例

见“试题描述

数据规模及约定

见“试题描述

题解

最优解一定是在一段连续的包含 \(0\) 号点的区间中选择最小的 \(k\) 个印花,其中一边需要折返(即代价为两倍距离)。

所以我们先将一边的距离 \(\times 2\),然后两边分别求出 \(f_k\) 表示印 \(k\) 个花至少需要花费的代价,最后枚举一边的答案,并通过剩余步数二分得到另一边的答案即可。

考虑一边的 \(f_k\) 如何处理,这个方案其实就是确定一个点 \(u\),然后印 \(0\) 到 \(u\) 之间的最小的 \(k\) 个花,不难发现随着 \(k\) 增加,\(u\) 也是单调移动的。由于不好确定最优解具体在哪,我们考虑分治解决这个问题,令 \(solve(l, r, ql, qr)\) 表示答案在区间 \([l, r]\) 中,询问区间为 \([ql, qr]\),这个时候我们询问一下 \([ql, qr]\) 的中点(这个询问就是暴力扫一遍 \([l, r]\) 然后再数据结构查询一下前 \(k\) 小的总和,找到最优的位置 \(p\),下次左半部分的询问归到 \([l, p]\) 中,右半部分归到 \([p, r]\) 中),然后继续递归下去就好了。我们需要一个数据结构支持查询区间内前 \(k\) 小的数之和,主席树就可以实现。

最后总复杂度是 \(O(n \log^2 n)\),那个分治是 \(O(n \log n)\) 的,因为每层最多询问 \(O(n)\) 次,有 \(\log n\) 层。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cctype>
  6. #include <algorithm>
  7. using namespace std;
  8. #define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)
  9. #define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)
  10. #define LL long long
  11. LL read() {
  12. LL x = 0, f = 1; char c = getchar();
  13. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  14. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  15. return x * f;
  16. }
  17. #define maxn 100010
  18. #define maxnode 2000010
  19. #define ool (1ll << 60)
  20. #define pli pair <LL, int>
  21. #define x first
  22. #define y second
  23. #define mp(x, y) make_pair(x, y)
  24. int n, dis[maxn], Time[maxn], num[maxn];
  25. LL lim;
  26. pli Info[maxn];
  27. LL sumv[maxnode];
  28. int ToT, rt[maxn], lc[maxnode], rc[maxnode], siz[maxnode];
  29. void update(int& y, int x, int l, int r, int p) {
  30. sumv[y = ++ToT] = sumv[x] + num[p];
  31. siz[y] = siz[x] + 1;
  32. if(l == r) return ;
  33. int mid = l + r >> 1; lc[y] = lc[x]; rc[y] = rc[x];
  34. if(p <= mid) update(lc[y], lc[x], l, mid, p);
  35. else update(rc[y], rc[x], mid + 1, r, p);
  36. return ;
  37. }
  38. LL query(int o, int l, int r, int k) {
  39. if(!o) return 0;
  40. if(siz[o] == k) return sumv[o];
  41. int mid = l + r >> 1;
  42. if(k <= siz[lc[o]]) return query(lc[o], l, mid, k);
  43. else return sumv[lc[o]] + query(rc[o], mid + 1, r, k - siz[lc[o]]);
  44. }
  45. LL Query(int p, int k) {
  46. if(k > p) return ool;
  47. return query(rt[p], 1, n, k) + Info[p].x;
  48. }
  49. void process(int l, int r, int ql, int qr, LL *ans) {
  50. int mid = ql + qr >> 1;
  51. LL res = ool, opt;
  52. rep(i, l, r) {
  53. LL tmp = Query(i, mid);
  54. if(res > tmp) res = tmp, opt = i;
  55. }
  56. ans[mid] = res;
  57. if(ql == qr) return ;
  58. process(l, opt, ql, mid, ans);
  59. process(opt, r, mid + 1, qr, ans);
  60. return ;
  61. }
  62. void solve(LL *ans, int N) {
  63. ToT = 0; memset(lc, 0, sizeof(lc)); memset(rc, 0, sizeof(rc));
  64. rep(i, 1, N) update(rt[i], rt[i-1], 1, n, Info[i].y);
  65. process(1, N, 1, N, ans);
  66. return ;
  67. }
  68. LL ans1[maxn], ans2[maxn];
  69. int main() {
  70. n = read(); lim = read();
  71. rep(i, 1, n) dis[i] = read(), num[i] = Time[i] = read();
  72. sort(num + 1, num + n + 1);
  73. rep(i, 1, n) Time[i] = lower_bound(num + 1, num + n + 1, Time[i]) - num;
  74. int ans = 0;
  75. Info[1] = mp(0, Time[1]);
  76. rep(i, 2, n) Info[i] = mp(Info[i-1].x + (dis[i-1] << 1), Time[i]);
  77. solve(ans1, n);
  78. Info[1] = mp(dis[n], Time[n]);
  79. rep(i, 2, n - 1) Info[i] = mp(Info[i-1].x + dis[n-i+1], Time[n-i+1]);
  80. solve(ans2, n - 1);
  81. rep(i, 1, n) if(ans1[i] <= lim) ans = max(ans, (int)(i + upper_bound(ans2 + 1, ans2 + n, lim - ans1[i]) - ans2 - 1));
  82. rep(i, 1, n - 1) if(ans2[i] <= lim) ans = max(ans, i);
  83. Info[1] = mp(0, Time[1]);
  84. rep(i, 2, n) Info[i] = mp(Info[i-1].x + dis[i-1], Time[i]);
  85. solve(ans1, n);
  86. Info[1] = mp(dis[n] << 1, Time[n]);
  87. rep(i, 2, n - 1) Info[i] = mp(Info[i-1].x + (dis[n-i+1] << 1), Time[n-i+1]);
  88. solve(ans2, n - 1);
  89. rep(i, 1, n) if(ans1[i] <= lim) ans = max(ans, (int)(i + upper_bound(ans2 + 1, ans2 + n, lim - ans1[i]) - ans2 - 1));
  90. rep(i, 1, n - 1) if(ans2[i] <= lim) ans = max(ans, i);
  91. printf("%d\n", ans);
  92. return 0;
  93. }

[2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania的更多相关文章

  1. 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)

    清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...

  2. 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

    清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...

  3. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  4. 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)

    P4746 C's problem(c) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描述 小C是一名数学家,由于它自制力比较差 ...

  5. 清北学堂2017NOIP冬令营入学测试P4749 F’s problem(f)

    时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 这个故事是关于小F的,它有一个怎么样的故事呢. 小F是一个田径爱好者,这天它们城市里正在 ...

  6. 2018.8.8 Noip2018模拟测试赛(二十一)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 112分(OvO) 题目目录: T1:幸福的道路 T2:Solitaire T3:Flags 赛后心得: 第一题裸树d啊! ...

  7. 2018.8.7 Noip2018模拟测试赛(二十)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...

  8. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...

  9. noip2017集训测试赛(十一)Problem C: 循环移位

    题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 ...

随机推荐

  1. Mysql读写分离,主从同步实现

    随着用户量的增多,数据库操作往往会成为一个系统的瓶颈所在,因此我们可以通过实现数据库的读写分离来提高系统的性能. 通过设置主从数据库实现读写分离,主库负责“写”操作,从库负责“读”操作,根据压力情况, ...

  2. Django---URL、Views

    1.Django URL(路由系统) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Djang ...

  3. 使用docker安装和运行常用的数据库和中间件

    mysql: docker pull mysql: docker run --name mysql -p : -v /usr/share/zoneinfo/Asia/Shanghai:/etc/loc ...

  4. Asp.Net Core使用Nginx实现反向代理

    ---恢复内容开始--- 前两篇文章介绍了使用Docker作为运行环境,用Nginx做反向代理的部署方法,这篇介绍一下使用Nginx配合.Net Core运行时直接在Liunx上裸奔的方法. 一.安装 ...

  5. hadoop生态搭建(3节点)-06.hbase配置

    # http://archive.apache.org/dist/hbase/1.2.4/ # ==================================================== ...

  6. python数据类型及其特有方法

    一.运算符 in方法 "hello" in "abcdefghijklmnopqrstuvwxyz" "li" in ["gg&q ...

  7. POJ1985 树的直径(BFS

    Cow Marathon   Description After hearing about the epidemic of obesity in the USA, Farmer John wants ...

  8. linux io 学习笔记(01)---锁,信号量

    1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源. 2.sudo  dmesg -c 消除dmesg缓冲 3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性 ...

  9. JAXB轻松转换xml对象和java对象

    实体类如下: package com.cn.entity; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; ...

  10. HBase全网最佳学习资料汇总

    HBase全网最佳学习资料汇总 摘要: HBase这几年在国内使用的越来越广泛,在一定规模的企业中几乎是必备存储引擎,互联网企业阿里巴巴.百度.腾讯.京东.小米都有数千台的HBase集群,中国电信的话 ...