洛谷 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的订单, ...
随机推荐
- C# 单元测试学习笔记
1.什么是单元测试 2.单元测试的好处 (1)协助程序员尽快找到代码中bug的具体位置 (2)能够让程序员对自己的程序更有自信 (3)能够让程序员在提交项目之前就将代码变的更加的强壮 ...
- maven安装本地jar到本地仓库
注册到本地仓库 mvn install:install-file -DgroupId=cn.endv -DartifactId=endv-api -Dversion=1.0.1 -Dpackaging ...
- 1519484 - How to analyze network disconnections shown in system log (transaction SM21)
Symptom System log (transaction SM21) shows network disconnections, e.g.: Q04 Connection to user 264 ...
- Android开发常用开源框架:图片处理
https://blog.csdn.net/SGQ_CSDN/article/details/79910709 Android开发常用开源框架:图片处理 框架名称 功能描述 Android Unive ...
- 如何封装一个自己的win7系统并安装到电脑做成双系统
说明: 目前我是刚试玩所以总结得没有很详细,先粗略放一个,下次有时间再分开整理系统封装或者如何制作双系统. 教程参考地址: 1. https://www.sysceo.com/forum/thread ...
- Linux NFS 共享
通过NFS网络文件系统,可以通过网络共享目录,让网络上的其他主机可以通过挂载访问共享目录的数据. Server 安装相关软件包 [root@server ~]# yum install nfs-uti ...
- MyBatis日记(四):MyBatis——insert、update、delete、select
MyBatis简单增删改查操作,此处所做操作,皆是在之前创建的MyBatis的Hello world的工程基础上所做操作. 首先在接口文件(personMapper.java)中,添加操作方法: pa ...
- Gtest:事件
前言 有时候在测试的时候,我们会在测试前做一些初始化活动,和测试后做一些清理工作,gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作.总结一下gtest的事件一共有3种: 全局的,所 ...
- web页面死链测试方法
一.概述 > 来自百度百科释义 死链:指服务器的地址已经改变了.无法找到当前地址位置,包括协议死链和内容死链两种形式.死链出现的原因有网站服务器设置错误:某文件夹名称修改,路径错误链接变成死链等 ...
- rhce 考试题目总结
rhce 考试题目总结归类 开机需要做的事: 检查系统版本 配置yum源 修改selinux的模式 ping一下server机器 1.分区类题目 1.1 rhcsa 第十五题 添加swap分区 要点: ...