洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta。
1.取出最大的x,x+=delta;
2.算出切断后的两个新长度,都减去delta和q;
3.delta+=q;
将其他长度都加上q不好实现,我们就把新的两条减去p,相对大小关系不变,最后还原即可。
但这还不是正解:
1 //复杂度mlogn,m过大,要超时
2 #include<bits/stdc++.h>
3 using namespace std;
4 int n,m,q,u,v,t;
5 double p;
6 priority_queue<int,vector<int>,less<int> > que;
7 int delta;//记录偏移量
8
9 int read(){
10 int x=0,f=1;char c=getchar();
11 while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
12 while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
13 return x*f;
14 }
15
16 int main(){
17 n=read(),m=read(),q=read(),u=read(),v=read(),t=read();
18 p=(double)u/v;
19 for(int i=1;i<=n;i++){
20 int x;x=read();
21 que.push(x);
22 }
23 for(int i=1;i<=m;i++){
24 int temp;
25 temp=que.top()+delta;que.pop();
26 int a1=temp*p,a2=temp-a1;
27 a1-=delta+q,a2-=delta+q;
28 delta+=q;
29 que.push(a1),que.push(a2);
30 if(i%t==0) cout<<temp<<" ";
31 }
32 cout<<endl;
33 int num=0;
34 while(que.size()){
35 num++;
36 if(num%t==0)
37 cout<<que.top()+delta<<" ";
38 que.pop();
39 }
40 }
进一步分析发现从集合中取出的数是单调递减的,新的两段长度也是单调递减的,这是容易证明的。
所以有三个队列维护:原长度,新产生的长度1,新产生的长度2:
1 //隐晦的单调性
2 //用队列实现,去掉了优先队列的log,所以复杂度是m+nlogn
3 #include<bits/stdc++.h>
4 #define N 7000005
5 using namespace std;
6 bool cmp(const int &a,const int &b){
7 return a>b;
8 }
9
10 priority_queue<int>ans;
11 int cut1[N],now[N],cut2[N];
12 int n,m,q,u,v,t;
13 int sigma;
14 double p;
15 int h0,h1,h2;
16 int t0,t1,t2;
17
18 int main(){
19 scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
20 p=(double)u/v;int tmp;
21 for(int i=1;i<=n;i++){
22 int x;scanf("%d",&x);
23 now[++t0]=x;
24 }
25 h0=h1=h2=1;
26 sort(now+1,now+t0+1,cmp);//对所有蚯蚓从大到小排序
27 int top;
28 for(int i=1;i<=m;++i){
29 if(h0>t0){if(cut1[h1]>cut2[h2])top=cut1[h1++];else top=cut2[h2++];}
30 else if(now[h0]>=cut1[h1]&&now[h0]>=cut2[h2])top=now[h0],++h0;
31 else if(cut1[h1]>=cut2[h2]&&now[h0]<=cut1[h1])top=cut1[h1],++h1;
32 else top=cut2[h2],++h2;
33 //反正是要找三个队列中的最大值,有很多可以实现的做法
34 top+=sigma;
35 int a1=floor(p*(double)top),a2=top-a1;
36 sigma+=q;
37 a1-=sigma,a2-=sigma;
38 cut1[++t1]=a1,cut2[++t2]=a2;
39 if(i%t==0)printf("%d ",top);
40 }
41 putchar('\n');
42 for(int i=h0;i<=t0;++i)ans.push(now[i]);
43 for(int i=h1;i<=t1;++i)ans.push(cut1[i]);
44 for(int i=h2;i<=t2;++i)ans.push(cut2[i]);
45 for(int i=1;ans.size();++i){
46 if(i%t==0)printf("%d ",ans.top()+sigma);
47 ans.pop();
48 }
49 return 0;
50 }
其他细节的和上一种差不多。
洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)的更多相关文章
- 题解——洛谷P2827 NOIP提高组 2016 蚯蚓
队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...
- Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列
题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...
- 洛谷 1850 NOIP2016提高组 换教室
[题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...
- 洛谷P1563 [NOIP2016 提高组] 玩具谜题
题目链接:https://www.luogu.com.cn/problem/P1563 哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
- 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)
题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...
- 洛谷P1514 [NOIP2010提高组T4]引水入城
P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- 发布自己的npm组件库
发布自己的npm组件库 前期准备 **git上建立自己的仓库,这样子是为了在本地初始化时,可以直接生成对应的 package.json ** 克隆仓库 创建仓库成功后,gitbush本地,执行 git ...
- 发布Android库至MavenCentral详解
Sonatype 账号 MavenCentral 和 Sonatype 的关系 库平台 运营商 管理后台 MavenCentral Sonatype oss.sonatype.org 因此我们要发布L ...
- 在 Apache DolphinScheduler 上调试 LDAP 登录,亲测有效!
点击上方 蓝字关注我们 作者 | 小钻风 01 背景 当看这边文章时,那得恭喜您终于找到宝藏,这是梦开始的地方-- 使用 Apache DolphinScheduler 的小伙伴会遇到个挠脑袋的问题 ...
- Luogu1088 火星人 (康托展开)
皮一波 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...
- Windows 电脑杀毒简单有效的方式
Windows 电脑杀毒通常会选择杀毒软件,这样太笨重,且容易占内存和存在流氓软件侵入. 推荐使用 Windows 自带的恶意软件删除工具 按住 Win + R 键,弹出运行窗口,输入 mrt. 系统 ...
- 腾讯云服务器安装rabbitmq及简单测试记录
一.安装 近期对消息队列的学习让我对消息中间件产生了兴趣,而作为消息队列的使用的rabbitmq,就是我学习中间件的第一步. rabbitmq和erlang的安装 安装之前先检查环境: [root@V ...
- 使用Fiddler劫持网络资源为前端开发助力(示例:Dynamic CRM 表单开发 也能热更新? )
背景: 使用过vue开发的童鞋应该都知道,在开发vue项目的过程中,有个叫"热更新"的功能特别爽,在传统html开发到初次接触vue时,才发现原来前端开发可以这么香.热更新的表现形 ...
- [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)
[数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...
- 青源Talk第8期|苗旺:因果推断,观察性研究和2021年诺贝尔经济学奖
biobank 英国的基金数据因果推断和不同的研究互相论证,而非一个研究得到的接了就行.数据融合,data fusion,同一个因果问题不同数据不同结论,以及历史上的数据,来共同得到更稳健.更高效的推 ...
- 【HTML】学习路径1-网页基本结构-标签基本语法
本系列将学习最基础的web前端知识: HTML---CSS---JavaScripts---jQuery 四大部分学习完以后再进入到JavaWeb的知识.(后端) 然后再学习SpringBoot技术. ...