容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的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. C# 虚方法、抽象方法

    一.虚方法(virtual) 作用:当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法. 示例: class Person { public virtual void XXX() { Con ...

  2. 发布Android库至MavenCentral详解

    Sonatype 账号 MavenCentral 和 Sonatype 的关系 库平台 运营商 管理后台 MavenCentral Sonatype oss.sonatype.org 因此我们要发布L ...

  3. 技术分享 | 将GreatSQL添加到系统systemd服务

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1 ...

  4. 技术分享 | 在MySQL对于批量更新操作的一种优化方式

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 作者:景云丽.卢浩.宋源栋 GreatSQL社区原创内容未经授权不得随意使用,转 ...

  5. 自己做一个RTOS

    什么是操作系统?其实就是一个程序, 这个程序可以控制计算机的所有资源,对资源进行分配,包括CPU时间,内存,IO端口等,按一定规则分配给所需要的进程(进程?也就是一个程序,可以单独执行),并且自动控制 ...

  6. cmake错误的解决

    安装Mysql时出现:CMake Error: Error executing cmake:: LoadCache(). Aborting. 对比:/usr/bin/cmake 和 /usr/loca ...

  7. Mybatis核心配置文件中的标签介绍

    0. 标签顺序 Mybatis核心配置文件中有很多标签,它们谁谁写在前写在后其实是有顺序要求的: 从前到后: properties?,settings?,typeAliases?,typeHandle ...

  8. Fiddler抓包工具下载安装及使用

    一.Fiddler简介 简介: Fiddler是一款强大的Web调试工具,他能记录所有客户端和服务器的HTTP/HTTPS请求 工作原理: Fiddler是以代理web服务器的形式工作的,它使用代理地 ...

  9. QQ高级功能

    本篇文章为微信公众号:酿俗 教学内容请跟着小编一起探索吧! 第一步解锁微信豆影藏内容 随后下载需要的材料,注意!手机可能会提示有病毒!这里使用这些功能报病毒很正常 其实并没有病毒只是手机厂商的安全系统 ...

  10. Python入门系列(六)一篇学会python函数

    函数 函数是只在调用时运行的代码块. def my_function(): print("Hello from a function") my_function() 信息可以作为参 ...