一道欺负我智商的题。。。

本来想打单调队列优化dp的,结果看到算法标签就点了此题

洛谷题面

首先你要理解题意,蒟蒻理解了好久。它就是说,给你一个由1和-1组成的数列,让你分成m段,并让这m段区间和最大值最小,还要求多种方案时字典序最小。

我也不知道大佬怎么做的,反正我不会高斯消元。。。

哦,对了,如果输入的是0,表示他不喜欢则那一位为-1。

设总和为S。区间和最小值为ans。后缀和为sum[],后缀中0的个数为cnt[]。

为什么是后缀,往后看。。。

首先考虑特殊情况:

  • 全是1 显然答案为ans=ceil(S/m);ceil()是向上取整。
  • 全是-1 ans=ceil(abs(S)/m)
  • 一半全1,一半全-1 比如11111-1-1-1可以变成11(111-1-1-1),括号里为0,可以与任意区间搭配,于是变成了上面的情况。

所以ans=ceil(abs(S)/m),简易证明:你可以用第三中方法狂消1和-1直到只有一种数,剩下来的数的个数是abs(S)。

如果abs(S)=0且能分的区间不足m那就另当别论。。。

由于我太菜了,还有情况没考虑就多多包含

先预处理sum[],ans,cnt[];

  • S=0
  • cnt[1]>=m,此时找sum[i]=0的点i,用单调队列维护找出字典序最小的一条即可。
  • cnt[1]<m,ans>0,和下面一起处理。
  • S!=0 sum的每一种取值分开考虑。

设上一个选的为last,则这一个i能选要满足abs(sum[last+1]-sum[i+1])<=ans,那么我们枚举sum[i+1]的取值时就可以直接从sum[last+1]-ans到sum[last+1]+ans。
  并且abs(sum[i+1]/m'(即剩下要选的数量))要满足小于等于ans,i还有后面的数不能超过m'个。
  然后跑单调队列就完啦,不要告诉我你切黑题还不会这个。。。

实现起来还有不少细节,比如负数下标之类的,仔细看下应该都能懂

如果你想TLE的话deque走起

#include<cstdio>
#include<algorithm>
const int N=5e5+;
int a[N],sum[N],cnt[N],tot;
struct node
{
int l,r,val;
}p[N<<];
inline int newnode(int l,int r,int val)
{
p[++tot]=(node){l,r,val};
return tot;
}
struct que
{
int start,end,len;
inline void push_back(int x)
{
if(!len)start=end=newnode(,,x);
else p[end].r=newnode(end,,x),end=p[end].r;
++len;
}
inline int empty(){return !len;}
inline int front(){return p[start].val;}
inline int back(){return p[end].val;}
inline void pop_front(){start=p[start].r;--len;}
inline void pop_back(){end=p[end].l;--len;}
inline void push(int x)
{
while(!empty()&&a[back()]>a[x])pop_back();
push_back(x);
}
}dui[N<<],dui1[N<<],*q=dui+N,*q1=dui1+N;
inline int min(const int &x,const int &y)
{return a[x]<a[y]?x:y;}
int main()
{
int n,m,ans;scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d%d",&a[i],&sum[i]),sum[i]=sum[i]?:-;
for(int i=n-;i;--i)sum[i]+=sum[i+];
for(int i=n;i;--i){cnt[i]+=cnt[i+];if(!sum[i])++cnt[i];}
cnt[n+]=-;
// for(int i=1;i<=n+1;++i)printf("%d %d\n",sum[i],cnt[i]);
int s=sum[];
ans=s?(abs(s)-)/m+:cnt[]<m;//printf("ss%d\n",ans);
if(ans)
{
a[n+]=n+;int la=;
for(int i=;i<=n;++i)
q1[sum[i]].push_back(i-);
for(int i=;i<m;++i)
{
int aa=n+;
for(int j=sum[la+]-ans;j<=sum[la+]+ans;++j)
{
if((abs(j)+m-i-)/(m-i)>ans)continue;
while(!q1[j].empty()&&n-q1[j].front()>=m-i){if(q1[j].front()>la)q[j].push(q1[j].front());q1[j].pop_front();}
while(!q[j].empty()&&q[j].front()<=la){q[j].pop_front();}
if(!q[j].empty())aa=min(aa,q[j].front());
}
la=aa;
printf("%d ",a[aa]);
}
}
else
{
for(int i=,j=;i<m;++i)
{
for(;cnt[j+]>=m-i;++j)
if(!sum[j+])
q[].push(j);
printf("%d ",a[q[].front()]);
q[].pop_front();
}
}
printf("%d\n",a[n]);
return ;
}

HNOI2013旅行的更多相关文章

  1. 3141: [Hnoi2013]旅行 - BZOJ

    Description Input 第一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号.Bi ...

  2. bzoj3141: [Hnoi2013]旅行

    Description   Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...

  3. 【LG3229】[HNOI2013]旅行

    题面 洛谷 题解 勘误:新的休息点a需要满足的条件2为那一部分小于等于ans 代码 \(100pts\) #include <iostream> #include <cstdio&g ...

  4. BZOJ3141:[HNOI2013]旅行

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

  5. [HNOI2013]题解

    代码在最后 [HNOI2013]比赛 记忆化搜索 把每一位还需要多少分用\(27\)进制压进\(long\) \(long\),\(map\)记忆化一下即可 [HNOI2013]消毒 先考虑在二维平面 ...

  6. Hnoi2013题解 bzoj3139~3144

    话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...

  7. # HNOI2012 ~ HNOI2018 题解

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

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】

    刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...

随机推荐

  1. 高可用注册中心 ->Spring Cloud Eureka

    在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况, 所以在生产 环境中必须对各个组件进行高可用部署, 对于微服务如此, 对于服务注册中心也一样. 但 是到本节为止,我们一直都在使用单节点 ...

  2. 高可用OpenStack(Queen版)集群-1. 集群环境

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  3. python—启动自带shell时报错(丢失api-ms-win-crt-runtime-l1-1-0.dll)已解决

    备注: 有的伙伴安装完1后重启,问题可以解决,summer儿在安装完1依然未能解决,于是又进行了2的安装再次重启后问题解决!! 1,安装vc-redist.x64,微软官网搜索免费下载,安装后重启. ...

  4. (xampp)lampp 下配置https(ssl)自签双向认证以后 apache无法启动解决方案

    自签CA一般是没有应用场景的,因为需要客户端浏览器导入证书才能访问 但是在某些需要内部使用的场景下,确实是一个解决方案 但是在lampp配置了双向认证以后发现 原来自带的管理命令 lampp star ...

  5. linux 其他知识目录

    博客目录总纲首页 为博客园添加目录的方法总结 linux 命令自动补全包 手动配置网卡 nginx日志统计 Linux 深入理解inode/block/superblock /proc/sys目录下各 ...

  6. JS中判断对象是不是数组的方法

    JavaScript中检测对象的方法 1.typeof操作符 这种方法对于一些常用的类型来说那算是毫无压力,比如Function.String.Number.Undefined等,但是要是检测Arra ...

  7. 【Oracle】存储过程在字符串单引号'内拼接单引号'

    http://blog.csdn.net/u011704894/article/details/44976557 一般变量里面接3个单引号 eg: 'DELETE FROM RDM_SUPP_DATA ...

  8. “北航Clubs”项目汇报

    一.项目展示 二.用户的痛点与需求 1.北航学生,在百团大战之后,很难再有渠道加入社团,了解社团活动,简直如蒙在鼓里! 2.当你周末想参加一些活动,充实一下枯燥的求学生活时,却发现不知道有哪些社团有活 ...

  9. YQCB冲刺周第六天

    站立会议如上图 任务看板: 今天的任务为依旧为将用户记录的数据添加到数据库中,以及金额球的设置. 遇到的问题为金额球在jsp页面的显示.

  10. css3学习笔记一

    首先界面是二维的但也可以有三维的效果.先了解浏览器兼容性问题,火狐加前缀(-moz-)IE加(-MF-)谷歌加(-webkit),简单介绍css3的几个属性. 对于背景来说如果是单纯着一种颜色可以会单 ...