洛谷 P2897 【蚯蚓】 题解
先分析一下题意:
这个题说的就是一开始给你很多条蚯蚓,然后给出你规定的次数,每一次都从蚯蚓里面拿出最长的来切成一条是原来q倍的,另一条是原来的(1 - q)倍,把切开的两条再放回去。规定次数完成之后,再将剩余的全部蚯蚓从大到小顺序输出,就是酱紫QWQ
可以看出,有一种很暴力很简单的方法,将每一条蚯蚓的长度都放入一个大根堆(优先队列)中,然后从1 - m次每一次都从堆顶(队首)取出最长的那条蚯蚓然后按照给出的u,v切开再放回大根堆(优先队列),这里的大根堆和优先队列都是可以直接排序的只需要将数放进去就好了,这样暴力m次。m次完成之后,从堆顶(队首)每一次输出堆顶(队首)的数,然后弹出知道堆空(队列空)结束了。
没有这么简单!!!!!!
在剪断一条蚯蚓的同时其他的蚯蚓还会长大!!!马上就会想到是区间修改, 因为出现了区间修改,不过这个区间是一定的,一定是除了最大的那个之外的, 所以可以只在最大的那一个上面最手脚,毕竟只有一个, 所以修改起来也是容易的很多, 可以每一次 不增加只记录增加次数最后用到的时候再加 那么那个不加的怎么办呢? 可以减去需要加的数,这样就很巧妙了,可以和别的一样加上相同的数,同时还可以让排序是正确的 不然别的都没加那么就会影响排序
代码
#include<iostream>
#include<cstdio>
#include<queue> using namespace std;
priority_queue<int>q;
int main()
{
int n,m,qq,u,v,t;
//n:蚯蚓数 ; m : m秒内的状况 ; q :其余蚯蚓增加的长度
int qwq;
scanf("%d%d%d%d%d%d",&n,&m,&qq,&u,&v,&t);
double p;
p = u * 1.0 / v;
for(int i = ;i <= n;++ i)
{
scanf("%d",&qwq);
q.push(qwq);
}
int jss = ;
while(m --)
{
int awa = q.top() + jss * qq;
jss ++;
if(jss % t == )
printf("%d ",awa);
q.pop();
int X1 = awa * p;
int aa = X1 - jss * qq;
int bb = (awa - X1) - jss * qq;
q.push(aa);q.push(bb);
}
printf("\n");
int js = ;
while(!q.empty())
{
js ++;
if(js % t == )
printf("%d ",q.top() + jss * qq);
q.pop();
}
printf("\n");
return ;
}
不过很好的是,只有85分,三个点都是1.2s,就超了一丢丢只需要优化一下下就好了。
但是可以怎么优化呢?
其实这里可以发现一种很显然的单调性,如果你将一开始的蚯蚓排好序 那么前一条蚯蚓切出来的两条蚯蚓一定各自 大于等于后面一条蚯蚓切出来的两条蚯蚓 毕竟前一条蚯蚓一定大于等于后面那一个,所以切出来的分半放在两个数组中和后面对应的切出来的两条也一定是大于等于的 所以可以设置三个单调队列(或者sort排序然后用数组储存) 每一次切得时候都从三个队列里面找最大的切就好了
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
const int M1 = 1e5 + ;
const int M2 = 8e6;
using namespace std;
int a[M1];
int b[M2];
int c[M2];
bool cmp(int x,int y)
{
return x > y;
}
int main()
{
int n,m,qq,u,v,t;
//n:蚯蚓数 ; m : m秒内的状况 ; q :其余蚯蚓增加的长度
int qwq;
scanf("%d%d%d%d%d%d",&n,&m,&qq,&u,&v,&t);
a[n + ] = -0x7fffffff;
double p;
p = u * 1.0 / v;
for(int i = ;i <= n;++ i)
scanf("%d",&a[i]);
sort(a + ,a + n + ,cmp);
int js = ;
int ja = ;
int jb = ,tb = ;
int jc = ,tc = ;
int Max;
int zuobiao;
while(m --)
{
if(a[ja] >= b[jb] && a[ja] >= c[jc])
{
Max = a[ja];
ja ++;
}
else
if(b[jb] >= a[ja] && b[jb] >= c[jc])
{
Max = b[jb];
jb ++;
}
else
if(c[jc] >= a[ja] && c[jc] >= b[jb])
{
Max = c[jc];
jc ++;
}
int awa = Max + js * qq;
js ++;
if(js % t == )
printf("%d ",awa);
int X1 = awa * p;
b[++ tb] = X1 - js * qq;
c[++ tc] = (awa - X1) - js * qq;
}
printf("\n");
int ans = ;
for(int i = ja;i <= n;++ i)a[i] += qq * js;
for(int i = jb;i <= tb;++ i)b[i] += qq * js;
for(int i = jc;i <= tc;++ i)c[i] += qq * js;
b[tb + ] = -0x7fffffff;
c[tc + ] = -0x7fffffff;
while(ja <= n || jb <= tb || jc <= tc)
{
ans ++;
if(a[ja] >= b[jb] && a[ja] >= c[jc] && ja <= n)
{
if(ans % t == )
printf("%d ",a[ja]);
ja ++;
}
else
if(b[jb] >= a[ja] && b[jb] >= c[jc] && jb <= tb)
{
if(ans % t == )
printf("%d ",b[jb]);
jb ++;
}
else
if(c[jc] >= a[ja] && c[jc] >= b[jb] && jc <= tc)
{
if(ans % t == )
printf("%d ",c[jc]);
jc ++;
}
}
printf("\n");
return ;
}
洛谷 P2897 【蚯蚓】 题解的更多相关文章
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- NOIP 2016 洛谷 P2827 蚯蚓 题解
题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...
- 洛谷p2827蚯蚓题解
题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那 ...
- 洛谷 P2827 蚯蚓 题解
每日一题 day32 打卡 Analysis 我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部 ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
- [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解
原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...
- [洛谷P3948]数据结构 题解(差分)
[洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
随机推荐
- 【解决方案】ArcGIS导入要素集后没反应
内容源自:ArcGIS10.2基础教程(丁华) 书上要求: 1.在“练习”文件夹中新建一个名为“沈阳”的个人地理数据库和名为“shenyang”的要素集,设置地理坐标为“Xi'an 1980”,高程坐 ...
- "Sed" 高级实用功能汇总
sed命令有两个空间,一个叫pattern space,一个叫hold space.这两个空间能够证明人类的脑瓜容量是非常小的,需要经过大量的训练和烧脑的理解,才能适应一些非常简单的操作. 不信看下面 ...
- sqlserver 2005 数据库的差异备份与还原
找到一个可靠的步骤,点开链接:http://blog.csdn.net/kevindr/article/details/22154323
- Python进阶(九)----json模块, pickle模块, os模块,sys模块,hashlib模块
Python进阶----json模块, pickle模块, os模块,sys模块,hashlib模块 一丶序列化模块 什么是序列化: 将一种数据结构,转换成一个特殊的序列(特殊字符串,用于网络传输 ...
- Elasticsearch 主要监控指标 -- 描述了es监控的几个维度,相当不错!
转发自:https://blog.csdn.net/majianxiong_lzu/article/details/90437559 主要指标梳理 Cluster Health – Nodes and ...
- JMeter学习笔记(十八)——返回的响应数据出现中文乱码_解决方案
一.问题描述 使用jmeter过程中遇到了请求返回的响应数据出现中文乱码 二.原因分析 当没有对响应数据or响应页面设置支持解析中文的编码时,JMeter则会以默认的ISO-8859-1格式解析,而其 ...
- day 19 作业
今日作业 1.什么是对象?什么是类? 对象是特征与技能的结合体,类是一系列对象相同的特征与技能的结合体 2.绑定方法的有什么特点 由对象来调用称之为对象的绑定方法,不同的对象调用该绑定方法,则会将不同 ...
- HTMLTestRunner 用PyCharm执行测试成功但无法生成报告问题
在pythoncharm中运行时,运行成功,但是没有生成测试报告这个问题 代码: if __name__ == '__main__': # 创建测试套件suite suite = unittest.T ...
- iframe页面script交互
主页面: <html> <tr> <td> <div id=RightViewDiv> <iframe name=SubSeekFrame sty ...
- DNS 原理入门 - 阮一峰(转载)
DNS 原理入门 作者: 阮一峰 日期: 2016年6月16日 DNS 是互联网核心协议之一.不管是上网浏览,还是编程开发,都需要了解一点它的知识. 本文详细介绍DNS的原理,以及如何运用工具软件 ...