先分析一下题意:

这个题说的就是一开始给你很多条蚯蚓,然后给出你规定的次数,每一次都从蚯蚓里面拿出最长的来切成一条是原来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 【蚯蚓】 题解的更多相关文章

  1. 洛谷P2827 蚯蚓 题解

    洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...

  2. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

  3. 洛谷p2827蚯蚓题解

    题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那 ...

  4. 洛谷 P2827 蚯蚓 题解

    每日一题 day32 打卡 Analysis 我们可以想一下,对于每一秒除了被切的哪一个所有的蚯蚓都增长Q米,我们来维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部 ...

  5. 洛谷NOIp热身赛题解

    洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...

  6. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  7. [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)

    [POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...

  8. [NOI 2020 Online] 入门组T1 文具采购(洛谷 P6188)题解

    原题传送门 题目部分:(来自于考试题面,经整理) [题目描述] 小明的班上共有 n 元班费,同学们准备使用班费集体购买 3 种物品: 1.圆规,每个 7 元. 2.笔,每支 4 元. 3.笔记本,每本 ...

  9. [洛谷P3948]数据结构 题解(差分)

    [洛谷P3948]数据结构 Description 最开始的数组每个元素都是0 给出n,opt ,min,max,mod 在int范围内 A: L ,R ,X 表示把[l,R] 这个区间加上X(数组的 ...

  10. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

随机推荐

  1. .NET Core微服务学习-DotNetty

    DotNetty介绍: DotNetty是Azure团队仿照(几乎可以这么说)JAVA的Netty而出来的(目前已实现Netty的一部分),目前在Github上的Star有1.8K+, 地址:http ...

  2. C语言--简易词法分析器

    #include <stdio.h>#include <stdlib.h>#include <string.h>int p,m,syn,n,sum;       / ...

  3. selenium中元素操作之简单的鼠标、键盘操作(三)

    1.鼠标操作导入类:ActionChains --鼠标的操作形成一连串的动作链,由selenium的ActionChains类来完成模拟鼠标操作手表操作的过程:1.鼠标的操作,先放到一个列表中2.利用 ...

  4. python 基础(三)

    tuple: 元组被定义后无法被修改 count(): #count(obj) 统计obj在元组中出现的次数 tup = (1,2,3,4,5,6,5,5,5,5,5,5,5) print(tup.c ...

  5. k8s--yml文件2

  6. 【开发工具】- Atom下载及安装

    原文地址:https://www.jianshu.com/p/c112f024e0ab

  7. provide inject应用及和props对比

    之前本人写过几篇element ui源码解析,其中提到provide/inject,当时只是匆匆带过,没有做深入研究,直到后来一次开发,需要实现孙组件更改父组件的值才想起来,原来这一对属性有如此大的用 ...

  8. Java 之 Session

    Session 一.概述 Session技术:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中. 二.使用步骤 1.获取 HttpSession ...

  9. SpringBoot 传入JSON对象参数

    1.请求参数格式必须是正确的JSON. 2.在入参中使用注解@RequestBody,用于接收JSON参数,使其自动转对象 3.关于lombok在此产生的一点小坑,@Builder对@RequestB ...

  10. POSIX多线程

    全文共分四部分: POSIX多线程—概述    POSIX多线程—异步编程举例    POSIX多线程—线程基本概念    POSIX多线程—互斥量概述 POSIX多线程—概述 Content 1. ...