Description

Input

第一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数。接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号。Bi为0或1;如果Bi=0则表示城市Ai没有小L想去的景点,如果Bi=1则表示城市Ai有小L想去的景点,
Ai两两不同且有1<=Ai<=N,即{Ai}为1,2....N的一个排列。
例如{2,1,3,4...N}
N<=500000,M<=200000

Output

t仅包括一行,包含m个空格隔开的正整数X1,X2...Xm,t仅包括一行,包含m个空格隔开的正整数X1,X2...Xm,为给小L安排的旅行计划对应的路线。为给小L安排的旅行计划对应的路线。

Sample Input

8 3

2 0

3 1

4 1

1 0

5 0

6 1

7 1

8 0

Sample Output

1 6 8

HINT

第1个月得到2点快乐值与2点疲劳值,第2个月得到1点快乐值与1点疲劳值,第3 个月得到1点快乐值与1点疲劳值。3个月中疲劳值与快乐值差的最大值为0,达到所有方 案最小值。

可行方案有:

1 6 8

3 6 8

3 1 8

其中1 6 8字典序最小。

感谢两位的题解http://www.cnblogs.com/lazycal/archive/2013/07/29/3221342.htmlhttp://cxjyxx.me/?p=329

基本上就是他们说的了,本人愚笨,两天才刷掉它

  1. 我就随便讲一下
  2. 对每一个s[i]做一个单调队列
  3. 在单调队列里维护a[i]单调递增
  4. ans0
  5. 每次把可以作为解的点加入单调队列,把a[i]比他小的都删掉,然后取队头
  6. ans不为0
  7. 如果n-m+1可以做现在的解,把n-m+1这个点加进单调队列,操作一样
  8. 为什么可以这样做,我认为是因为入队的顺序本来是按从近到远的顺序,而且都可以作为现在的解,如果a[i]比a[j]大,ji后面,那肯定就把i删除了
  1. var
  2. s,sum,sum2,c:array[..]of longint;
  3. first,tail:array[-..]of longint;
  4. next,pre,num:array[..]of longint;
  5. n,m,ans,tot,l:longint;
  6.  
  7. function get(l,m:longint):longint;
  8. begin
  9. if sum[l]= then
  10. if sum2[l]>=m then exit()
  11. else exit()
  12. else
  13. begin
  14. get:=abs(sum[l])div m;
  15. if abs(sum[l])mod m> then inc(get);
  16. end;
  17. end;
  18.  
  19. procedure insert(x:longint);
  20. var
  21. i:longint;
  22. begin
  23. if get(x+,m-)>ans then exit;
  24. inc(tot);
  25. num[tot]:=x;
  26. if first[sum[x+]]= then
  27. begin
  28. first[sum[x+]]:=tot;
  29. tail[sum[x+]]:=tot;
  30. exit;
  31. end;
  32. i:=tail[sum[x+]];
  33. while (i<>)and((c[num[i]]>c[x])or(num[i]<l)) do
  34. begin
  35. if pre[i]= then
  36. begin
  37. i:=;
  38. break;
  39. end;
  40. i:=pre[i];
  41. end;
  42. if i= then
  43. begin
  44. first[sum[x+]]:=tot;
  45. tail[sum[x+]]:=tot;
  46. exit;
  47. end;
  48. pre[tot]:=i;
  49. next[i]:=tot;
  50. tail[sum[x+]]:=tot;
  51. end;
  52.  
  53. procedure work2;
  54. var
  55. i,k:longint;
  56. begin
  57. l:=;
  58. k:=;
  59. while m> do
  60. begin
  61. while sum2[k]>=m- do
  62. begin
  63. if sum[k+]= then insert(k);
  64. inc(k);
  65. end;
  66. while num[first[]]<l do
  67. first[]:=next[first[]];
  68. pre[first[]]:=;
  69. write(c[num[first[]]],' ');
  70. l:=num[first[]]+;
  71. dec(m);
  72. end;
  73. write(c[n]);
  74. halt;
  75. end;
  76.  
  77. procedure init;
  78. var
  79. i:longint;
  80. begin
  81. read(n,m);
  82. for i:= to n do
  83. begin
  84. read(c[i],s[i]);
  85. if s[i]= then s[i]:=-;
  86. end;
  87. for i:=n downto do
  88. begin
  89. sum[i]:=sum[i+]+s[i];
  90. sum2[i]:=sum2[i+];
  91. if sum[i]= then inc(sum2[i]);
  92. end;
  93. ans:=get(,m);
  94. if ans= then work2;
  95. for i:= to n-m do
  96. insert(i);
  97. end;
  98.  
  99. procedure work;
  100. var
  101. i,j,min,sl,sr:longint;
  102. begin
  103. l:=;
  104. while m> do
  105. begin
  106. insert(n-m+);
  107. sl:=sum[l]-ans;
  108. sr:=ans+sum[l];
  109. j:=;
  110. min:=;
  111. for i:=sl to sr do
  112. begin
  113. while (first[i]<>)and((num[first[i]]<l)or(get(num[first[i]]+,m-)>ans)) do
  114. first[i]:=next[first[i]];
  115. pre[first[i]]:=;
  116. if first[i]<> then
  117. if c[num[first[i]]]<min then
  118. begin
  119. min:=c[num[first[i]]];
  120. j:=num[first[i]];
  121. end;
  122. end;
  123. write(min,' ');
  124. l:=j+;
  125. dec(m);
  126. end;
  127. write(c[n]);
  128. end;
  129.  
  130. begin
  131. init;
  132. work;
  133. end.

3141: [Hnoi2013]旅行 - BZOJ的更多相关文章

  1. bzoj3141: [Hnoi2013]旅行

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

  2. BZOJ3141:[HNOI2013]旅行

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

  3. 3142:[HNOI2013]数列 - BZOJ

    题目描述 Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨. 股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天 ...

  4. 3144:[HNOI2013]切糕 - BZOJ

    题目描述 Description 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你 ...

  5. 3139:[HNOI2013]比赛 - BZOJ

    题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...

  6. 3140:[HNOI2013]消毒 - BZOJ

    题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...

  7. Bzoj 2718: [Violet 4]毕业旅行 && Bzoj 1143: [CTSC2008]祭祀river 传递闭包,二分图匹配,匈牙利,bitset

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1878  Solved: 937[Submit][St ...

  8. HNOI2013旅行

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

  9. 【LG3229】[HNOI2013]旅行

    题面 洛谷 题解 勘误:新的休息点a需要满足的条件2为那一部分小于等于ans 代码 \(100pts\) #include <iostream> #include <cstdio&g ...

随机推荐

  1. [算法练习] UVA-401-Palindromes

    UVA Online Judge 题目401  Palindromes 回文串 问题描述: 回文串(Palindromes)就是正着读和反着读完全一样的字符串,例如"ABCDEDCBA&qu ...

  2. js中关于事件处理函数名后面是否带括号的问题

    今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Leve ...

  3. 今天写了几个css属性

    <!DOCTYPE html> <html> <head> <meta charset=UTF-8"> <title></t ...

  4. SQL按照日、周、月、年统计数据

    写sql语句分别按日,星期,月,季度,年统计销售额 --按日 select sum(consume),day([date]) from consume_record where year([date] ...

  5. android输入框显示在软键盘上边

    有时候在界面需要输入的时候,如果输入框在界面的下方,软键盘弹出的时候会遮挡输入框界面,对用户的体验不是很好. 在网上找的别人的解决方案 首先: 清单文件里面配置:android:windowSoftI ...

  6. COM原理

    1, 进程内组件:服务程序杯加载到客户的进程空间,通常是DLL的形式.本地组件:服务程序与与客户程序在同一台电脑上,通常是EXE.远程组件: 服务程序与与客户程序在不同的电脑上,可以是DLL模块也可是 ...

  7. C++与Lua交互(二)

    上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...

  8. jquery文字左右滚动

    实现jquery文字左右滚动 <div class="fl">中奖名单:</div> <div class="scrollText" ...

  9. 【CLR VIA C#】读书笔记

    工作几年了才看,记录下笔记备忘. 章节 笔记 1.CLR的执行模型 公共语言运行时(Common Language Runtime,CLR) 源代码-->编译器检查语法和分析源代码-->托 ...

  10. JS传参出现乱码(转载)

    问题说明:在进行网站开发时,将表单的提交功能交给JS来传递,但是在传递中文的过程中出现类似于繁体字的乱码. 解决方案:为了解决这个问题,首先从底层的C#代码审查,重新设置页面传值进行模拟,但是几经测试 ...