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 ...
随机推荐
- [算法练习] UVA-401-Palindromes
UVA Online Judge 题目401 Palindromes 回文串 问题描述: 回文串(Palindromes)就是正着读和反着读完全一样的字符串,例如"ABCDEDCBA&qu ...
- js中关于事件处理函数名后面是否带括号的问题
今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Leve ...
- 今天写了几个css属性
<!DOCTYPE html> <html> <head> <meta charset=UTF-8"> <title></t ...
- SQL按照日、周、月、年统计数据
写sql语句分别按日,星期,月,季度,年统计销售额 --按日 select sum(consume),day([date]) from consume_record where year([date] ...
- android输入框显示在软键盘上边
有时候在界面需要输入的时候,如果输入框在界面的下方,软键盘弹出的时候会遮挡输入框界面,对用户的体验不是很好. 在网上找的别人的解决方案 首先: 清单文件里面配置:android:windowSoftI ...
- COM原理
1, 进程内组件:服务程序杯加载到客户的进程空间,通常是DLL的形式.本地组件:服务程序与与客户程序在同一台电脑上,通常是EXE.远程组件: 服务程序与与客户程序在不同的电脑上,可以是DLL模块也可是 ...
- C++与Lua交互(二)
上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...
- jquery文字左右滚动
实现jquery文字左右滚动 <div class="fl">中奖名单:</div> <div class="scrollText" ...
- 【CLR VIA C#】读书笔记
工作几年了才看,记录下笔记备忘. 章节 笔记 1.CLR的执行模型 公共语言运行时(Common Language Runtime,CLR) 源代码-->编译器检查语法和分析源代码-->托 ...
- JS传参出现乱码(转载)
问题说明:在进行网站开发时,将表单的提交功能交给JS来传递,但是在传递中文的过程中出现类似于繁体字的乱码. 解决方案:为了解决这个问题,首先从底层的C#代码审查,重新设置页面传值进行模拟,但是几经测试 ...