3141: [Hnoi2013]旅行 - BZOJ
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.html和http://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的更多相关文章
- bzoj3141: [Hnoi2013]旅行
Description Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...
- BZOJ3141:[HNOI2013]旅行
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...
- 3142:[HNOI2013]数列 - BZOJ
题目描述 Description 小T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨. 股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察到:除第一天外每天 ...
- 3144:[HNOI2013]切糕 - BZOJ
题目描述 Description 经过千辛万苦小 A 得到了一块切糕,切糕的形状是长方体,小 A 打算拦腰将切糕切成两半分给小 B.出于美观考虑,小 A 希望切面能尽量光滑且和谐.于是她找到你,希望你 ...
- 3139:[HNOI2013]比赛 - BZOJ
题目描述 Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联赛共N只队伍参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支 ...
- 3140:[HNOI2013]消毒 - BZOJ
题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...
- 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 ...
- HNOI2013旅行
一道欺负我智商的题... 本来想打单调队列优化dp的,结果看到算法标签就点了此题 洛谷题面 首先你要理解题意,蒟蒻理解了好久.它就是说,给你一个由1和-1组成的数列,让你分成m段,并让这m段区间和最大 ...
- 【LG3229】[HNOI2013]旅行
题面 洛谷 题解 勘误:新的休息点a需要满足的条件2为那一部分小于等于ans 代码 \(100pts\) #include <iostream> #include <cstdio&g ...
随机推荐
- unity3d游戏无法部署到windows phone8手机上的解决方法
今天搞了个unity3d游戏,准备部署到自己的lumia 920上,数据线连接正常,操作正常,但是“build”以后,始终无法部署到手机上,也没有在选择的目录下生产任何相关文件.(你的系统必须是win ...
- mysql 打包表在phpmyadmin提示正在使用中..
一,利用phpmyadmin修改表功能,REPAIR TABLE `你的表名` 或直接在数据库管理界面,选中表如下图 二,如果利用修改功能失败了我们还可以尝试在替换本地mysql数据库时,我们先停止m ...
- 第六篇、AVplayer定制视频播放控件
1.引用头文件#import AVFoundation 2.自定义AVPlayer(播放的机器) 3.自定义AVPlayerItem(胶片) >> 视频的URL转成AVAsset 4.AV ...
- 大家注意:升级 win8.1 火狐浏览器 谷歌浏览器 搜狗五笔输入法 都不能用啦
大家注意:升级 win8.1 火狐浏览器 谷歌浏览器 搜狗五笔输入法 都不能用啦 我的电脑64位 win8 thinkpad e531,8G内存 刚在线升级完8.1,发现这些问题,大家注意,有知道问题 ...
- Java 对于继承的初级理解
概念:继承,是指一个类的定义可以基于另外一个已存在的类,即子类继承父类,从而实现父类的代码的重用.两个类的关系:父类一般具有各个子类共性的特征,而子类可以增加一些更具个性的方法.类的继承具有传递性,即 ...
- WIN32一些文件及窗口操作
0,获取指定的系统路径: #include <shlobj.h> #pragma comment(lib, "shell32.lib") TCHAR szPat ...
- Oracle 常用命令
一 管理用户 查询用户集合 select username from dba_users; A 查询某个用户是否存在 select username from dba_users where user ...
- mysql中的count(primary_key)、count(1)、count(*)的区别
表结构如下: mysql> show create table user\G; *************************** 1. row ********************** ...
- 【Winform】锐浪报表使用
在发开报表时,使用了锐浪报表. 需要注意的一些细节: 1.给staticbox设置文本,通过GridppReport的变量,使用ControlByName获取到控件后进行设置文字 _report.Co ...
- firefox ie chrome 设置单元格宽度 td width 有bug,不能正常工作。以下方式可以解决
1. firefox ie chrome 设置单元格宽度 td width 有bug,不能正常工作. 如果是上面一行 和下面一行是分别属于两个table,但是他们的列需要对齐,也就是说分开画的,然后设 ...