洛谷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 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- 第三天python3 字典
字典 dict 特点:key-value键值对的数据的集合 可变的.无序的.key不重复:非线性结构: 字典的初始化 d=dict() 或者 d = { } dict(**kwargs) 使用n ...
- SpringBoot使用CORS的addCorsMappings中会遇到的问题
跨域需要后端需要设置响应的跨域头 如下 public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/ ...
- Border Theory
持续更新中!!!更个屁,无线停更! 前言: KMP 学傻了,看 skyh 说啥 border 树,跑来学 border 理论 洛谷云剪切板:https://www.luogu.com.cn/paste ...
- Java异步记录日志-2022新项目
一.业务场景 web项目开发中,经常会有的一个操作是记录请求日志,比如记录请求的IP地址,记录请求的路径,记录请求的参数等等. 每个系统都会根据自己的需要来记录一些请求相关的日志.一般会将记录的日志信 ...
- appache ab测试高并发
ab使用范例: 要执行 1000 次的 connection, 20 次的 concurrent (并行, 同时): 语法: ab -n 1000 -c 20 http://localhost/ind ...
- 使用SSH连接解决git报错:fatal: unable to access 'https://github.com/xxx/xxx.github.io.git/': Proxy CONNECT aborted
TL;DRs 这个错误的原因和HTTPS的代理配置有关,使用SSH方式连接可以避免这一问题 最近git pull和push的时候总是报错 fatal: unable to access 'https: ...
- 在.NET 6.0中使用不同的托管模型
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 本章是<定制ASP NET 6.0框架系列文章>的第六篇.在本章中,我 ...
- Go 语言图片处理简明教程
虽然 Go 语言主要用于 Web 后端以及各类中间件和基础设施开发,也难免遇到一些图像处理的需求.Go 语言提供的 image 标准库提供了基本的图片加载.裁剪.绘制等能力,可以帮助我们实现一些绘图需 ...
- 经典设计原则 - SOLID
SOLID 设计原则包含以下 5 种原则: 单一职责原则(Single Responsibility Principle, SRP) 开闭原则(Open Closed Principle, OCP) ...
- java中使用 POI导出excel表格的简单实现
大概流程分7步: 1.创建工作簿 --> 2.创建sheet表 --> 3.创建row行(建议使用循环) --> 4.用row行逐一创建单元格(建议使用循环) --> 5.单元 ...