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字典序最小。

题解:

数组b[i]表示城市a[i]是否为有小L想去的景点,1表示有,-1表示没有

记sum[i]=b[i+1]+b[i+2]+...+b[n],S=sum[0],最大值最小为d,则

if S==0

  if sum[i]==0 的个数 >= m 则将这些等于0的数做一遍单调队列

  else d=1

else d=ceil(abs(S)/m)

证明见http://cxjyxx.me/?p=329

然后就是如何求字典序最小

我们每次要找到一个 能使后面的数仍然有解的 最小的一个数作为结尾

设这个新区间是第i个区间,结束点为k

首先这个新区间要合法,则abs(S-sum[k])/(m-i)<=d

然后要保证后面要有解,则ceil(abs(sum[k])/(m-i))<=d

然后用单调队列维护每种sum值的最小值

具体见代码

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define maxn 500005
 7 #define base maxn
 8 using namespace std;
 9 char ch;
10 bool ok;
11 void read(int &x){
12     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') ok=1;
13     for (x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());
14     if (ok) x=-x;
15 }
16 struct Point{int v,id;};
17 int cnt;
18 struct node{
19     Point p;
20     int pre,next;
21 }T[maxn<<1];
22 int newnode(Point p,int pre,int next){T[++cnt]=(node){p,pre,next};return cnt;}
23 struct queue{
24     int siz,head,tail;
25     bool empty(){return !siz;}
26     void push_front(Point p){
27         if (!siz) head=tail=newnode(p,0,0);
28         else T[head].pre=newnode(p,0,head),head=T[head].pre;
29         ++siz;
30     }
31     void push_back(Point p){
32         if (!siz) head=tail=newnode(p,0,0);
33         else T[tail].next=newnode(p,tail,0),tail=T[tail].next;
34         ++siz;
35     }
36     void pop_front(){siz--,head=T[head].next;}
37     void pop_back(){siz--,tail=T[tail].pre;}
38     Point front(){return T[head].p;}
39     Point back(){return T[tail].p;}
40 }list[maxn<<1];
41 int tot,now[maxn<<1],pre[maxn<<1];
42 Point point[maxn<<1];
43 int n,m,last,val[maxn],sum[maxn],rest[maxn];
44 void add(int u,Point p){pre[++tot]=now[u],now[u]=tot,point[tot]=p;}
45 int calc(){
46     int ans=0;
47     for (int i=n;i>=1;i--){
48         if (!sum[i]) ans++,rest[i]=1;
49         rest[i]+=rest[i+1];
50     }
51     if (ans>=m) return 0; else return 1;
52 }
53 void push(int u,Point p){
54     while (!list[u].empty()&&p.v<list[u].back().v) list[u].pop_back();
55     list[u].push_back(p);
56 }
57 Point calc(int u,int lim){
58     for (int p=now[u];p&&point[p].id<=lim;p=pre[p]) push(u,point[p]),now[u]=p;
59     while (!list[u].empty()&&list[u].front().id<=last) list[u].pop_front();
60     return list[u].empty()?(Point){maxn,maxn}:list[u].front();
61 }
62 Point min(Point a,Point b){return a.v<b.v?a:b;}
63 int main(){
64     read(n),read(m);
65     for (int i=1;i<=n;i++) read(val[i]),read(sum[i-1]),sum[i-1]=(sum[i-1])?1:-1;
66     for (int i=n-1;i>=0;i--) sum[i]+=sum[i+1];
67     for (int i=n;i>=1;i--) add(sum[i]+base,(Point){val[i],i});
68     int S=sum[0],d=(S!=0)?(int)ceil(1.0*abs(S)/(1.0*m)):calc();
69     if (d){
70         for (int i=1;i<m;i++){
71             Point ans=(Point){maxn,maxn};
72             for (int j=S-d+base;j<=S+d+base;j++){
73                 if (ceil(abs(1.0*j-base)/(1.0*m-i))<=d)
74                     ans=min(ans,calc(j,n-(m-i)));
75             }
76             printf("%d ",ans.v);
77             last=ans.id,S=sum[last];
78         }
79         printf("%d\n",val[n]);
80     }
81     else{
82         for (int i=1,p=now[base];i<m;i++){
83             for (;p&&rest[point[p].id]-1>=m-i;p=pre[p]) push(base,point[p]);
84             printf("%d ",list[base].front().v);
85             list[base].pop_front();
86         }
87         printf("%d\n",val[n]);
88     }
89     return 0;
90 }

转载于:https://www.cnblogs.com/chenyushuo/p/5090137.html

bzoj3141: [Hnoi2013]旅行相关推荐

  1. [bzoj3141][HNOI2013]旅行

    题目描述 在遥远的HX 国,住着一个旅行家小L,他希望骑着他的自行车游遍全国.在这个国家中,每个城市都有一个编号,共有n 个城市,编号从1 到n.有的城市没有小L 想去的景点,而有的城市有且仅有一个小 ...

  2. BZOJ3141:[HNOI2013]旅行

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

  3. # HNOI2012 ~ HNOI2018 题解

    HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...

  4. 2022-2028年中国在线旅行预订市场投资分析及前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了在线旅行行业相关概述.中国在线旅行行业运行环境.分析了中国在线旅行行 ...

  5. LeetCode简单题之旅行终点站

    题目 给你一份旅游线路图,该线路图中的旅行线路用数组 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示该线路将会从 cityAi 直接前往 cityBi .请你找出 ...

  6. usaco Cow Tours 牛的旅行

    Cow Tours 牛的旅行 农民 John 的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场. 但是就目前而言,你能看到至少有两个牧区不连通.这样,农民 John 就有 ...

  7. gatsby_如何使用Gatsby和Leaflet创建夏季公路旅行地图绘制应用程序

    gatsby Get ready for the summer by building your own road trip mapping app with this step-by-step gu ...

  8. 汉印标签打印机app_旅行一族福音 汉印CP4000L便携照片打印机体验

    最近一段时间,有个问题经常在我脑海中出现:"我们为什么需要打印照片?" 不过没想到,让我瞬间解除这个疑惑的,却是近期刚刚上市的一款便携照片打印机-汉印CP4000L.自从知晓这款产 ...

  9. 2D景观转3D风景大片,无惧复杂光线与遮挡,人类离「躺着旅行」的梦想又近了一步...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 整理:公众号@机器之心 本文仅做学术分享,如有侵权,请联系删除. 万物皆可转 3D. 上班的时候想旅行 ...

最新文章

  1. python join 的使用
  2. CentOS搭建本地光盘YUM源
  3. 获取程序代码块资源消耗
  4. VA01保存后都更新了什么表
  5. Python中的生成器与yield
  6. python基础-第三篇-函数编程
  7. Vue.js中data,props和computed数据
  8. 均值滤波器类型_详解图像滤波原理及实现!
  9. 有限差分法FDM和有限元法FEA比较
  10. glide从入门到精通使用
  11. Jsp 中遇到待解决问题
  12. Spring.Net学习笔记十(打造简易的依赖注入框架)
  13. Zabbix安装界面显示PHP time zone 为“红色”的解决办法
  14. S7-200 PC ACCESS下载安装及常见问题解决思路指南
  15. 【eoeAndroid社区索引】Android二维码知识汇总
  16. 【Altium Designer10详细安装】
  17. 关于射频技术在粮食安全的科研进展
  18. 分享收集网络上的免费0元虚拟主机
  19. JavaScript面试题111-120
  20. android圆形菜单,android 圆形旋转菜单例子

热门文章

  1. Spring Aop实例之xml配置
  2. Struts2+Hibernate分页显示实例
  3. JS一起学05:Date对象、封闭空间、函数传参和封装、获取非行间样式、字符串操作
  4. SSL,SSH,OpenSSL,OpenSSH,HTTPS的区别
  5. 时间戳转格式化日期,日期转换成时间戳
  6. 《深入理解计算机系统》读书笔记二:内存,高速缓存存储器
  7. Google(谷歌)中国工程研究院 工程师 方坤 对学生朋友的一些建议
  8. 办公文档加密,企业文档加密,强制性透明加密技术,fasoft
  9. linux运维入门第一周的学习部分命令!
  10. mac connect to host localhost port 22: Connection refused