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

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

我就随便讲一下
对每一个s[i]做一个单调队列
在单调队列里维护a[i]单调递增
当ans为0时
每次把可以作为解的点加入单调队列,把a[i]比他小的都删掉,然后取队头
当ans不为0时
如果n-m+1可以做现在的解,把n-m+1这个点加进单调队列,操作一样
为什么可以这样做,我认为是因为入队的顺序本来是按从近到远的顺序,而且都可以作为现在的解,如果a[i]比a[j]大,j在i后面,那肯定就把i删除了
 var
s,sum,sum2,c:array[..]of longint;
first,tail:array[-..]of longint;
next,pre,num:array[..]of longint;
n,m,ans,tot,l:longint; function get(l,m:longint):longint;
begin
if sum[l]= then
if sum2[l]>=m then exit()
else exit()
else
begin
get:=abs(sum[l])div m;
if abs(sum[l])mod m> then inc(get);
end;
end; procedure insert(x:longint);
var
i:longint;
begin
if get(x+,m-)>ans then exit;
inc(tot);
num[tot]:=x;
if first[sum[x+]]= then
begin
first[sum[x+]]:=tot;
tail[sum[x+]]:=tot;
exit;
end;
i:=tail[sum[x+]];
while (i<>)and((c[num[i]]>c[x])or(num[i]<l)) do
begin
if pre[i]= then
begin
i:=;
break;
end;
i:=pre[i];
end;
if i= then
begin
first[sum[x+]]:=tot;
tail[sum[x+]]:=tot;
exit;
end;
pre[tot]:=i;
next[i]:=tot;
tail[sum[x+]]:=tot;
end; procedure work2;
var
i,k:longint;
begin
l:=;
k:=;
while m> do
begin
while sum2[k]>=m- do
begin
if sum[k+]= then insert(k);
inc(k);
end;
while num[first[]]<l do
first[]:=next[first[]];
pre[first[]]:=;
write(c[num[first[]]],' ');
l:=num[first[]]+;
dec(m);
end;
write(c[n]);
halt;
end; procedure init;
var
i:longint;
begin
read(n,m);
for i:= to n do
begin
read(c[i],s[i]);
if s[i]= then s[i]:=-;
end;
for i:=n downto do
begin
sum[i]:=sum[i+]+s[i];
sum2[i]:=sum2[i+];
if sum[i]= then inc(sum2[i]);
end;
ans:=get(,m);
if ans= then work2;
for i:= to n-m do
insert(i);
end; procedure work;
var
i,j,min,sl,sr:longint;
begin
l:=;
while m> do
begin
insert(n-m+);
sl:=sum[l]-ans;
sr:=ans+sum[l];
j:=;
min:=;
for i:=sl to sr do
begin
while (first[i]<>)and((num[first[i]]<l)or(get(num[first[i]]+,m-)>ans)) do
first[i]:=next[first[i]];
pre[first[i]]:=;
if first[i]<> then
if c[num[first[i]]]<min then
begin
min:=c[num[first[i]]];
j:=num[first[i]];
end;
end;
write(min,' ');
l:=j+;
dec(m);
end;
write(c[n]);
end; begin
init;
work;
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. 通过ASP禁止指定IP和只允许指定IP访问网站的代码

    过ASP禁止指定IP和只允许指定IP访问网站的代码,需要的朋友可以参考下. 一.禁止指定IP防问网站,并执行相应操作: 代码如下: <% Dim IP,IPString,VisitIP '设置I ...

  2. svn 分支整个项目合并主干

    1.首先主干要更新最新版本. 2.找到主干(trunk)点击右键--合并--合并类型选择(合并一个版本范围)点击下一步--合并源选择整个分支项目--将要合并的修改版本范围(选择指定(a)范围)点击下一 ...

  3. Win8、Win10进入SQL server配置管理器

    使用 WIN8.WIN10 访问 SQL Server 配置管理器 因为 SQL Server 配置管理器是 Microsoft 管理控制台程序的一个管理单元而不是单独的程序,所以,当运行 Windo ...

  4. ALTER---删除字段

    ALTER TABLE table_name DROP (column1,column2,...); 例: ALTER TABLE userinfo DROP (name,num); 说明: 1.or ...

  5. 过程式编程 drawShapes

    // // main.m // 3.2.1 过程式编程 #import <Foundation/Foundation.h> typedef enum { kCircle, kRectang ...

  6. WebGIS基础复习笔记

    明天要考试了,突击一下. 1.万维网:www是world wide web的简称是在超文本基础上形成的信息网 2.互联网:即广域局域网及单机按照一定的通讯协议组成的国际计算机网络 3.WebGIS:网 ...

  7. centos7搭建NIS与NFS综合应用

    实验环境: centos7(服务端)        redhat enterprise linux 7.2(客户端) 实验目的:用centos7的账号,能在redhat enterprise linu ...

  8. 第七章 探秘Qt的核心机制-信号与槽

    第七章 探秘Qt的核心机制-信号与槽 注:要想使用Qt的核心机制信号与槽,就必须在类的私有数据区声明Q_OBJECT宏,然后会有moc编译器负责读取这个宏进行代码转化,从而使Qt这个特有的机制得到使用 ...

  9. 谷歌浏览器支持小于12px的字体

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. asp.net 时间比较,常用于在某段时间进行操作

    DateTime.Compare(t1,t2)比较两个日期大小,排前面的小,排在后面的大,比如:2011-2-1就小于2012-3-2返回值小于零:  t1 小于 t2. 返回值等于零 : t1 等于 ...