【CF573E】Bear and Bowling

题面

洛谷

题解

首先有一个贪心的结论:

我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times a_i+b_i\),其中\(k_i\)为位置\(i\)之前被选的数的个数,\(b_i\)为\(i\)之后被选的数的和。

那么我们每次选这个贡献最大的位置一定最优。

然后来证一下这个结论的正确性(直接蒯了\(\text {I} \color{#FF0000} {\text {tst}}\)的):

引理:在上述贪心策略下,如果\(a_i>a_j\)且\(i<j\),则选\(i\)之前不可能选\(j\)。

证明考虑归纳:\(i,j\)中间不存在被选中的元素时是平凡的,如果\(i,j\)中间存在p个选中的元素,若\(V_i<V_j\)则一定在\([i,j]\)之间存在至少一个\(x\)满足\(a_x<a_j\),此时没有选\(i\)所以不可能选择\(x\),与假设不符,QED。

接下来假设贪心策略不正确,即在选择了集合\(A\)之后将下标为\(x\)的位置选中,但是最优的答案是选择集合\(A+B\),其中\(x\notin B\)。那么考虑:

1、如果\(B\)中存在位置在\(x\)左边,考虑在\(x\)左边的最右位置\(y\),那么此时有\(a_y\leq a_x,V_x≥V_y\)。此时加入集合\(B\)中的其他元素考虑\(V_x,V_y\)的变化,那么在\(x\)右边的元素对\(V_x,V_y\)的贡献一样,在\(y\)左边的元素对\(V_x,V_y\)的贡献是\(a_x,a_y\),而\(x,y\)中间没有在\(B\)中的元素,所以可以发现在其他元素加入之后\(V_x\geq V_y\),所以将\(B\)中\(y\)换成\(x\)结果不劣。

2、如果\(B\)中只有在\(x\)右边的元素,考虑在\(x\)右边的最左位置\(y\),那么\(B\)集合其他的元素对\(V_x,V_y\)的贡献是一样的,所以把\(y\)换成\(x\)也不会更劣。

故上述假设不成立,贪心正确性证毕。

考虑分块维护这个最大值。

每次选完最大值,就相当于对于选定的\(pos\),\(pos\)前的位置\(i\)中\(b_i\)均加上\(a_{pos}\),\(pos\)后的位置\(i\)中\(k_i\)均加上一。因为对于同一块我们加上的\(k,b\)是一样的,而\(pos\)所在的块可以\(\sqrt n\)暴力重构,所以我们分块维护凸壳就可以了。

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <queue>
  8. using namespace std;
  9. const int MAX_N = 1e5 + 5;
  10. const int LEN = 320;
  11. int N, a[MAX_N], id[MAX_N], bel[MAX_N], L[LEN], R[LEN];
  12. long long tk[LEN], tb[LEN], f[MAX_N], ans;
  13. double slope(int i, int j) {
  14. if (a[i] == a[j]) return f[i] > f[j] ? -1e20 : 1e20;
  15. else return (double)(f[i] - f[j]) / (a[i] - a[j]);
  16. }
  17. long long calc(int i) { return f[i] + tk[bel[i]] * a[i] + tb[bel[i]]; }
  18. struct Hull {
  19. deque<int> q;
  20. void clear() { q.clear(); }
  21. void insert(int i) {
  22. while (q.size() > 1 && slope(q[q.size() - 2], q[q.size() - 1])
  23. < slope(q[q.size() - 1], i)) q.pop_back();
  24. q.push_back(i);
  25. }
  26. pair<long long, int> query() {
  27. while (q.size() > 1 && calc(q[0]) <= calc(q[1]))
  28. q.pop_front();
  29. return make_pair(calc(q[0]), q[0]);
  30. }
  31. } S[LEN];
  32. void modify(int l, int ed, int k, int b) {
  33. while (l <= ed) {
  34. int x = bel[l], r = min(R[x], ed);
  35. if (l == L[x] && r == R[x]) tk[x] += k, tb[x] += b;
  36. else for (int i = l; i <= r; i++) f[i] += 1ll * k * a[i] + b;
  37. l = r + 1;
  38. }
  39. }
  40. pair<long long, int> query(int l, int ed) {
  41. pair<long long, int> res = make_pair(0, 0);
  42. while (l <= ed) {
  43. int x = bel[l], r = min(R[x], ed);
  44. if (l == L[x] && r == R[x]) res = max(res, S[x].query());
  45. else for (int i = l; i <= r; i++) res = max(res, make_pair(calc(i), i));
  46. l = r + 1;
  47. }
  48. return res;
  49. }
  50. void build(int x) {
  51. for (int i = L[x]; i <= R[x]; i++) f[i] += tk[x] * a[i] + tb[x];
  52. tk[x] = tb[x] = 0, S[x].clear();
  53. for (int i = L[x]; i <= R[x]; i++) S[x].insert(id[i]);
  54. }
  55. int main () {
  56. #ifndef ONLINE_JUDGE
  57. freopen("cpp.in", "r", stdin);
  58. #endif
  59. scanf("%d", &N);
  60. for (int i = 1; i <= N; i++) {
  61. scanf("%d", a + i);
  62. f[i] = a[i], id[i] = i;
  63. bel[i] = (i - 1) / LEN + 1;
  64. if (!L[bel[i]]) L[bel[i]] = i;
  65. R[bel[i]] = i;
  66. }
  67. for (int i = 1; i <= bel[N]; i++)
  68. sort(&id[L[i]], &id[R[i] + 1], [](int l, int r) { return a[l] < a[r]; }), build(i);
  69. long long ans = 0;
  70. while (1) {
  71. pair<long long, int> res = query(1, N);
  72. if (res.first <= 0) break;
  73. ans += res.first;
  74. f[res.second] = -1ll << 60;
  75. if (res.second > 1) modify(1, res.second - 1, 0, a[res.second]);
  76. if (res.second < N) modify(res.second + 1, N, 1, 0);
  77. build(bel[res.second]);
  78. }
  79. printf("%lld\n", ans);
  80. return 0;
  81. }

【CF573E】Bear and Bowling的更多相关文章

  1. 【CF573D】Bear and Cavalry 线段树

    [CF573D]Bear and Cavalry 题意:有n个人和n匹马,第i个人对应第i匹马.第i个人能力值ai,第i匹马能力值bi,第i个人骑第j匹马的总能力值为ai*bj,整个军队的总能力值为$ ...

  2. 【CF679D】Bear and Chase 最短路+乱搞

    [CF679D]Bear and Chase 题意:近日,鼠国的头号通缉犯,神出鬼没的怪盗——Joker正于摩登市出没!对于名侦探Jack来说,这正是将其捉拿归案的大号时机.形式化地,摩登市可以看成一 ...

  3. 【codeforces】Bear and Three Balls(排序,去重)

    Bear and Three Balls Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  4. 【CF771A】Bear and Friendship Condition

    题目大意:给定一张无向图,要求如果 A 与 B 之间有边,B 与 C 之间有边,那么 A 与 C 之间也需要有边.问这张图是否满足要求. 题解:根据以上性质,即:A 与 B 有关系,B 与 C 有关系 ...

  5. 【CodeForces】790 C. Bear and Company 动态规划

    [题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...

  6. 【CodeForces】679 A. Bear and Prime 100

    [题目]A. Bear and Prime 100 [题意]有一数字x,每次可询问一个数字y是否x的因子,最后输出数字x是否素数,要求询问次数<=20. [题解]容易发现[2,100]范围内的非 ...

  7. 【CodeForces】679 B. Bear and Tower of Cubes

    [题目]B. Bear and Tower of Cubes [题意]有若干积木体积为1^3,2^3,...k^3,对于一个总体积X要求每次贪心地取<=X的最大积木拼上去(每个只能取一次)最后总 ...

  8. 【32.89%】【codeforces 574D】Bear and Blocks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. 【19.05%】【codeforces 680D】Bear and Tower of Cubes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

随机推荐

  1. TCP连接的建立(三次握手和四次挥手)

    写到最后发现我描述的挺水的,这个老哥的用语比较专业一点https://blog.csdn.net/qq_38950316/article/details/81087809  (老哥这篇有些许错别字 大 ...

  2. NPOI中的PhysicalNumberOfCells 与 LastCellNum

    这两个理论上一个是算空列,一个不算空列,但是实际上有时候相同数据的excel,不同的excel编辑工具保存后的,PhysicalNumberOfCells可能不一样,会导致莫名其妙错误,最好使用Las ...

  3. MySQL各类型字段可定义最大宽度

    今天浏览mysql的官网文档,无意中看到如图划线部分一句话,引起了我的兴趣,所以决定做实验官方所言. 条例1.创建数据表时,所有字段定义时"宽度之和"不得超过65535字节: 条例 ...

  4. file 从InputStream读取byte[]示例

    file 从InputStream读取byte[]示例 分类专栏: java基础   public static byte[] getStreamBytes(InputStream is) throw ...

  5. # .NET Core下操作Git,自动提交代码到

    .NET Core下操作Git,自动提交代码到 转自博客园(阿星Plus) .NET Core 3.0 预览版发布已经好些时日了,博客园也已将其用于生产环境中,可见 .NET Core 日趋成熟 回归 ...

  6. Java初学者推荐学习书籍PDF免费下载

    场景 Effective Java 中文版Java核心技术 卷Ⅰ 基础知识(第8版)Java语言程序设计-进阶篇(原书第8版)疯狂Java讲义Java从入门到精通 第三版Java编程思想第4版重构-改 ...

  7. 渗透技巧——导出Chrome浏览器中保存的密码

    0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息.信息越全面,越有助于进一步的渗透.对于Windows系统,用户浏览器往往包含有价值的信息. 在之前的文章<本地密码查看工具LaZa ...

  8. cpio建立、还原备份档

    1. 简介 加入.解开cpio或tar备份档内的文件 与tar相似,将文件归档到硬盘或磁带等存储设备中 2. tar比较 在所处理的文件类型方面,它比tar更全面,但也更复杂 cpio比tar更为可靠 ...

  9. 【学习笔记】PYTHON语言程序设计(北理工 嵩天)

    1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则     摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...

  10. 常用SQL语句分享

    前言:  日常工作或学习过程中,我们可能会经常用到某些SQL,建议大家多多整理记录下这些常用的SQL,这样后续用到会方便很多.笔者在工作及学习过程中也整理了下个人常用的SQL,现在分享给你!可能有些S ...