容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的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. CentOS 定时计划任务设置

    一.安装crontab服务并设置开机自启 yum install crontabs (centos默认就会带,一般不需要安装) systemctl enable crond (设为开机启动) syst ...

  2. 向docker镜像中传递变量的两种方式

    测试用到的python文件: #!/usr/bin/env python3 #conding: utf-8 from http.server import HTTPServer, BaseHTTPRe ...

  3. go更新腾讯云DNSPod的解析记录

    纯粹练手用的,大家轻喷 获取SecretId,SecretKey 打开腾讯云,登录之后打开https://console.cloud.tencent.com/cam/capi,然后新建密钥记录生成的S ...

  4. Redis系列4:高可用之Sentinel(哨兵模式)

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 1 背景 从第三篇 Redis系列3:高可用之主从架构 ,我们知道,为Re ...

  5. YII页面缓存

    IndexController.php namespace frontend\controllers; use yii; use yii\web\Controller; class IndexCont ...

  6. 项目操作案例丨西门子PLC通过网关连接ACS800变频器

    本案例控制对象为炉条机.以及蒸汽的控制以及现场数据参数的显示以及报警. PLC 选用西门子 CPU,通过 ET200 IO 模块控制现场设备并监控数据.变频器采用ABB ACS800变频器,将ABB ...

  7. Vue 下拉框值变动事件传多个参数

    在使用 Vue 进行开发时,下拉框值变动事件 @change 是很常用的. 其传参一般分为两种方式:默认传参和自定义传参. 默认传参 @change 默认会传选中项标识的参数,在传参处不用定义,在方法 ...

  8. 跟我学Python图像处理丨基于灰度三维图的图像顶帽运算和黑帽运算

    摘要:本篇文章结合灰度三维图像讲解图像顶帽运算和图像黑猫运算,通过Python调用OpenCV函数实现. 本文分享自华为云社区<[Python图像处理] 十三.基于灰度三维图的图像顶帽运算和黑帽 ...

  9. 「学习笔记」斜率优化dp

    目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动 ...

  10. python数据精度问题

    一.python运算时精度问题: 1.运行时精度问题在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和十进制之间对应问题会导致数值的精度问题,比如无法用有限个 ...