容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的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 提高组] 蚯蚓 (二叉堆/队列)的更多相关文章

  1. 题解——洛谷P2827 NOIP提高组 2016 蚯蚓

    队列模拟 详细题解待填坑 #include <cstdio> #include <algorithm> #include <queue> #include < ...

  2. Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列

    题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...

  3. 洛谷 1850 NOIP2016提高组 换教室

    [题解] 先用floyed处理出两点间的最短路. 设f[i][j][k]表示走到第i个教室,总共换了j次,当前换或者不换,期望的最小移动距离. 分情况讨论来转移即可. #include<cstd ...

  4. 洛谷P1563 [NOIP2016 提高组] 玩具谜题

    题目链接:https://www.luogu.com.cn/problem/P1563 哈哈哈,这个题拿来一读是不是很吃惊hahaha,我刚开始读的时候吓了我一跳,这么长的题干,这么绕的题意,还有下面 ...

  5. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  6. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  7. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  8. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  9. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

随机推荐

  1. java 桥接方法

    1.桥接方法简介 桥接方法是jdk1.5引入泛型后,为使java泛型方法生成的字节码与jdk1.5版本之前的字节码兼容由编译器自动生成的. 可用method.isBridge() 判断method是否 ...

  2. fiddler抓包手机请求(转)

    http://ju.outofmemory.cn/entry/22854 从事前端开发的同学一定对Fiddler不陌生,它是一个非常强大的http(s)协议分析工具,如果你不知道它是什么,可以自行go ...

  3. .NET性能优化-使用SourceGenerator-Logger记录日志

    前言 在现在许许多多的应用系统中,日志非常关键,它即是排查问题的强力工具,也是程序员居家旅行工作甩锅必备良品. 在团队中编码中,我们都要求对于那些会变更数据的接口.调用第三方的接口记录请求和响应参数, ...

  4. Java中break、continue和return三者之间的区别

    控制流程语句 java关键字break.continue.return主要按三个纬度去区分. 作用不同 结束不同 紧跟不同  一.作用不同 1.break:执行break操作,跳出所在的当前整个循环, ...

  5. MMDetection 使用示例:从入门到出门

    前言 最近对目标识别感兴趣,想做一些有趣目标识别项目自己玩耍,本来选择的是 YOLOV5 的,但无奈自己使用 YOLOV5 环境训练模型时,不管训练多少次 mAP 指标总是为 0,而其它 pytorc ...

  6. Vue3系列11--Teleport传送组件

    Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,不受父级style.v-show等属性影响,但data.prop数据依旧能够共用的技术:类似于 Rea ...

  7. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  8. TypeScript 项目报错 Unknown file extension ".ts"

    下图是该问题的详细报错截图,经过多次捣鼓,初步猜测是模块有问题,要用 ES Module 还真是曲折,最不容易出错的就是 CommonJS 模块: 在百度.Bing 上搜索了好久的帖子也都没有相关的解 ...

  9. 【NOI P模拟赛】混凝土粉末(整体二分)

    题面 样例输入 5 8 1 1 4 2 2 3 1 2 3 3 1 2 5 1 2 3 3 2 5 2 2 1 2 2 1 3 样例输出 1 0 4 0 1 0 样例解释 题解 比这道题简单了不知多少 ...

  10. JOIOI王国 - 二分+贪心

    题面 题解 通过一句经典的话"最大值的最小值" 我判断它是二分题, 不难发现,整个图形中两个省的分界线是一条单调不递减或单调不递增的折线. 而且,越到后来它的最大值只会越来越大,最 ...