洛谷 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的订单, ...
随机推荐
- [個人紀錄] WindowsLiveWriter 插入代碼跳出錯誤
跳出找不到設定檔Can’t load configruaration fromC:\Users\…\AppData\Roaming\Windows Live Writer\WindowsLiveWri ...
- springboot项目,打包时携带所有依赖
springboot项目,打包时携带所有依赖 本文主要解决springboot打包时,如何设置才能把当前项目的所有依赖都打进去. Springboot 的自带spring-boot-maven-plu ...
- 2019-07-23 static 和 const 关键字的应用
首先先来了解下内存段,内存段共分为四个,栈.堆.代码段.初始化静态段.程序中不同的声明存放在不同的内存段内,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1, 10, 100 ...
- 企业如何避免错误决策?APS系统帮你忙
一家企业不论什么事情都是有一定的决策者们,企业的决策者是对整个企业的兴衰成败主宰者主要责任. 战略一词它源于军事,是指为了获得有利的信息而进行的部署计划,那么现在战略合作也是被广泛的应用到商业的以及生 ...
- Android Scroller详解
在学习使用Scroller之前,需要明白scrollTo().scrollBy()方法. 一.View的scrollTo().scrollBy() scrollTo.scrollBy方法是View中的 ...
- ipc$ 空连接 net use
常用命令 [xxx]表示的内容,需要根据自己的需求更改 //建立空连接 > net use \\127.0.0.1\ipc$ //删除连接 > net use \\127.0.0.1\ip ...
- 图说jdk1.8新特性(1)--- 函数式接口
函数式接口 总结起来就以下几点: 如果一个接口要想成为函数接口(函数接口可以直接用lambda方式简化),则必须有且仅有一个抽象的方法(非default和static) 可以通过注解@Function ...
- MySQL备份,使用xtrabackup备份全实例数据时,会造成锁等待吗?那么如果使用mysqldump进行备份呢?
一.xtrabackup和mysqldump会造成锁等待吗? xtrabackup会,它在备份时会产生短暂的全局读锁FTWL(flush table with read lock),用于拷贝frm/M ...
- php环境Unknown column '*' in 'field list'解决方案
在使用pymysql 做网站往数据库插入数据时发现如下错误:pymysql.err.InternalError: (1054, "Unknown column '*' in 'field l ...
- Mariadb/MySQL生产环境的my.cnf配置示例
Mariadb/MySQL生产环境的my.cnf配置示例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.针对MySQL主程序mysqld定义参数[mysqld] 1>. ...