题面

洛谷

题解





勘误:新的休息点a需要满足的条件2为那一部分小于等于ans

代码

\(100pts\)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. using namespace std;
  8. inline int gi() {
  9. register int data = 0, w = 1;
  10. register char ch = 0;
  11. while (!isdigit(ch) && ch != '-') ch = getchar();
  12. if (ch == '-') w = -1, ch = getchar();
  13. while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
  14. return w * data;
  15. }
  16. const int MAX_N = 5e5 + 5;
  17. int N, M, a[MAX_N], sum[MAX_N], cnt[MAX_N];
  18. struct Node { int l, r, v; } Line[MAX_N << 1]; int tot = 0;
  19. struct deque {
  20. int head, tail, len;
  21. deque() { head = tail = len = 0; }
  22. bool empty() { return !len; }
  23. int newNode(int l, int r, int v) { Line[++tot] = (Node){ l, r, v }; return tot; }
  24. int front() { return Line[head].v; }
  25. int back() { return Line[tail].v; }
  26. void pop_back() { tail = Line[tail].l, len--; }
  27. void pop_front() { head = Line[head].r, len--; }
  28. void push_back(int v) {
  29. if (!len) head = tail = newNode(0, 0, v);
  30. else Line[tail].r = newNode(tail, 0, v), tail = Line[tail].r;
  31. len++;
  32. }
  33. void push(int v) {
  34. while (len && a[back()] > a[v]) pop_back();
  35. push_back(v);
  36. }
  37. } Q[MAX_N << 1], Qu[MAX_N << 1], *q = Q + MAX_N, *qu = Qu + MAX_N;
  38. #define min(x, y) ((a[x]) < (a[y]) ? (x) : (y))
  39. int main() {
  40. #ifndef ONLINE_JUDGE
  41. freopen("cpp.in", "r", stdin);
  42. #endif
  43. N = gi(), M = gi();
  44. for (int i = 1; i <= N; i++) a[i] = gi(), sum[i] = gi(), sum[i] = sum[i] ? 1 : -1;
  45. for (int i = N - 1; i >= 1; i--) sum[i] += sum[i + 1];
  46. for (int i = N; i >= 1; i--) cnt[i] = cnt[i + 1] + (!sum[i]);
  47. int S = sum[1], d = S ? (abs(S) - 1) / M + 1 : cnt[1] < M;
  48. cnt[N + 1] = -1;
  49. if (!d) {
  50. for (int i = 1, j = 2; i < M; i++) {
  51. for (; cnt[j + 1] >= M - i; j++) if (!sum[j + 1]) q[0].push(j);
  52. printf("%d ", a[q[0].front()]);
  53. q[0].pop_front();
  54. }
  55. } else {
  56. for (int i = 2; i <= N; i++) qu[sum[i]].push_back(i - 1);
  57. int lst = 0;
  58. a[N + 1] = N + 1;
  59. for (int i = 1; i < M; i++) {
  60. int ans = N + 1;
  61. for (int j = sum[lst + 1] - d; j <= sum[lst + 1] + d; j++) {
  62. if (ceil(1.0 * abs(j) / (M - i)) > d) continue;
  63. for (; !qu[j].empty() && N - qu[j].front() >= M - i; qu[j].pop_front())
  64. if (qu[j].front() > lst) q[j].push(qu[j].front());
  65. for (; !q[j].empty() && q[j].front() <= lst; q[j].pop_front()) ;
  66. if (!q[j].empty()) ans = min(ans, q[j].front());
  67. }
  68. lst = ans, printf("%d ", a[ans]);
  69. }
  70. }
  71. printf("%d\n", a[N]);
  72. return 0;
  73. }

【LG3229】[HNOI2013]旅行的更多相关文章

  1. 3141: [Hnoi2013]旅行 - BZOJ

    Description Input 第一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号.Bi ...

  2. bzoj3141: [Hnoi2013]旅行

    Description   Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...

  3. HNOI2013旅行

    一道欺负我智商的题... 本来想打单调队列优化dp的,结果看到算法标签就点了此题 洛谷题面 首先你要理解题意,蒟蒻理解了好久.它就是说,给你一个由1和-1组成的数列,让你分成m段,并让这m段区间和最大 ...

  4. BZOJ3141:[HNOI2013]旅行

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...

  5. [HNOI2013]题解

    代码在最后 [HNOI2013]比赛 记忆化搜索 把每一位还需要多少分用\(27\)进制压进\(long\) \(long\),\(map\)记忆化一下即可 [HNOI2013]消毒 先考虑在二维平面 ...

  6. Hnoi2013题解 bzoj3139~3144

    话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...

  7. # HNOI2012 ~ HNOI2018 题解

    HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

随机推荐

  1. webstorm中导入git项目

    1.打开webStrom 配置git File–setting

  2. 死磕salt系列-salt 配置文件管理

    SLS是Salt State系统的核心,用来描述系统的目标状态,使用YAML语言书写.被用作配置文件管理. SLS文件 sls配置文件分为两种类型 top.sls 这是所有配置文件的入口 sls 这是 ...

  3. 【bootstrap】面包屑导航(Breadcrumbs)

    .breadcrumb > li + li:before { color: #CCCCCC; content: "/ "; padding: 0 5px; } <ol ...

  4. NodeManager 启动一会儿挂掉

    [root@hadoop1 hadoop-2.8.5]# less logs/yarn-root-nodemanager-hadoop1.log 查看日志发现  hostname配置错误 [root@ ...

  5. tortoisegit 学习

    注:陈刚在Ubuntu虚拟机架设了git的服务器,用于管理公司的代码工程: tortoisegit是TortoiseSVN的Git版本,tortoisegit用于迁移TortoiseSVN到Torto ...

  6. 安卓apk重新签名教程

    可能大家会有疑问,为什么安卓apk文件要重新签名,签名后有什么作用.这里我简单说一下,如果大家一直都是用官方的app的话那是不需要重新签名的.重新签名是对官方app进行了修改(如icon.图片.代码等 ...

  7. java核心技术-多线程之引导概念

    前两篇文章分别讲了,Java线程相关基础概念以及线程的内存模型,本节作为后续章节的引导,个人认为对于学习后面的只是还是比较重要.好了,既然说了多线程,那么首先要弄清以下几个问题: 1. 什么是多线程? ...

  8. 【PTA 天梯赛】L3-002 特殊堆栈(二分)

    堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除).本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的 ...

  9. 安装mysql时出现initialize specified but the data directory has files in in.Aborting.该如何解决

    eclipse中写入sql插入语句时,navicat中显示的出现乱码(???). 在修改eclipse工作空间编码.navicate中的数据库编码.mysql中my.ini中的配置之后还是出现乱码. ...

  10. mysql面试常见题目

    第一题 某班学生和考试成绩信息如下表Student所示: Student表 ID SName Mark 1 Jack 90 2 Marry 96 3 Rose 88 4 Bob 86 5 John 8 ...