3141: [Hnoi2013]旅行 - BZOJ
Description
.jpg)
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 ...
随机推荐
- 【TOMCAT】Tomcat gzip压缩传输数据
概述 由于我们项目的三维模型文件非常大,为了提高传输速度,在服务端对其做zip压缩处理非常有必要,能够极大的提高传输速度. 配置 首先需要修改web.xml中请求的数据文件的mime类型的mappin ...
- django 学习-7 模型数据操作
1.首先还是创建办一个项目和一个应用 django.admin.py startproject ssj cd ssj django.admin.py startapp sdj 那 ...
- C#数组比较取值
string strs = string.Empty; string[] strArray1 = { "a", "b", "c& ...
- JDBC之数据连接
:数据库语句: create database LandDB; use LandDB; create table T_BL_CANTON_CODE ( CTN_CODE int primary key ...
- Contoso 大学 - 6 – 更新关联数据
原文 Contoso 大学 - 6 – 更新关联数据 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's ...
- oracle是数据库的学习第一节:数据库的安装
一.本地oracle服务器 1.安装oracle服务器,可以到oracle官方网站上下载与自己电脑匹配的服务器,一般用10g,或者11g; 2.打开cmd,打开sql*plus,之后可以写SQL语句了 ...
- 20141014--判断语句switch case
1. switch case break(跳出) 距离break 最近的大括号,跳出这个大括号,执行大括号之后的命令 switch case 必须与 break 一同使用. 分别输入月份 几号 输出是 ...
- 开发者需要知道的11条HTML5小常识
#HTML5: The Missing Manual# 如果说HTML是一部电影,那HTML5就是一次大转折.HTML本来是不会活过21世纪的.官方Web标准组织W3C在1998年对HTML就已经撒手 ...
- spring中得到servletContext对象方法
1.spring得到servletContext,这个和session没有什么关系,上下文可以说是一个session容器,一个上下文可以有多个会话session 在web.xml中有以下配置后.加入s ...
- 洛古 P1373 小a和uim之大逃离
P1373 小a和uim之大逃离 题目提供者lzn 标签 动态规划 洛谷原创 难度 提高+/省选- 题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电 ...