HNOI2013旅行
一道欺负我智商的题。。。
本来想打单调队列优化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旅行的更多相关文章
- 3141: [Hnoi2013]旅行 - BZOJ
Description Input 第一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号.Bi ...
- bzoj3141: [Hnoi2013]旅行
Description Input 第 一行为两个空格隔开的正整数n, m,表示旅行的城市数与旅行所花的月数.接下来n行,其中第 i行包含两个空格隔开的整数Ai和Bi,Ai表示他第i个去的城市编号 ...
- 【LG3229】[HNOI2013]旅行
题面 洛谷 题解 勘误:新的休息点a需要满足的条件2为那一部分小于等于ans 代码 \(100pts\) #include <iostream> #include <cstdio&g ...
- BZOJ3141:[HNOI2013]旅行
浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem.p ...
- [HNOI2013]题解
代码在最后 [HNOI2013]比赛 记忆化搜索 把每一位还需要多少分用\(27\)进制压进\(long\) \(long\),\(map\)记忆化一下即可 [HNOI2013]消毒 先考虑在二维平面 ...
- Hnoi2013题解 bzoj3139~3144
话说好久没写题(解)了.. 先贴份题解:http://wjmzbmr.com/archives/hnoi-2013-%E9%A2%98%E8%A7%A3/(LJ神题解..Lazycal表示看不懂..) ...
- # HNOI2012 ~ HNOI2018 题解
HNOI2012 题解 [HNOI2012]永无乡 Tag:线段树合并.启发式合并 联通块合并问题. 属于\(easy\)题,直接线段树合并 或 启发式合并即可. [HNOI2012]排队 Tag:组 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ3143】【HNOI2013】游走 && 【BZOJ3270】博物馆 【高斯消元+概率期望】
刚学完 高斯消元,我们来做几道题吧! T1:[BZOJ3143][HNOI2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小 ...
随机推荐
- Android Dalvik虚拟机初识
摘自:http://blog.csdn.net/andyxm/article/details/6126907 首先,让我们来思考下面几个问题: 什么是Dalvik虚拟机? Dalvik VM与JVM有 ...
- Go的CSP并发模型
golang的goroutine机制: 一.go 内部有三个对象: P对象(processor) 代表上下文(或者可以认为是cpu),M(work thread)代表工作线程,G对象(g ...
- i++ i+=1 i=i+1 汇编代码效率比较
结论:一样.编译器和编译器之间可能有点区别但是程序不会变. 0x00 一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或 ...
- babel无法编译?
ECMAScript 6(ES6)的发展或者说普及之快可以说是难以想象的,对很多人来说ECMAScript 5(ES5)都还普及呢.现代浏览器对ES6新特新或多或少的有些支持,但支持度不高,所以要想在 ...
- 第九次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- 奔跑吧DKY——团队Scrum冲刺阶段博客汇总
第一周:团队展示 团队选题 需求规格说明书 第二周:完善需求规格说明书.制定团队编码规范.通过团队项目数据库设计 奔跑吧DKY--团队Scrum冲刺阶段-Day 1-领航 奔跑吧DKY--团队Scru ...
- 第一个scrim任务分布
一.项目经理:郭健豪 二.scrim分工 杨广鑫.郭健豪:制作第一个精选页面布局,和代码实现.如:实现图书推荐布局中图书的排布,搜索框代码的实现,消息提示的跳转 李明.郑涛:实现第一个精选页面数据库的 ...
- <<梦断代码>>读后感
<梦断代码>中对软件工程所面临的种种困难与艰难的描述,即便再过5年读也许都不过时.因为正如原作者所说,书中描写的是一队人马并肩扛起代码大石,虽历经磨难仍欲将其推上山顶的故事,而正是这种故事 ...
- 图文转换NABCD
作为图文转化还是有很多优点的,在这里我就分析一下它的方便快捷 Need:有些非电子版的文字不方便我们编辑,图文转换可以轻而易举达到目的. Approach:现在技术手段应该还有点难度,应该可以换个方法 ...
- java 框架 面试
Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC ...