传送门

35分做法

用堆来取最大值,暴力更新其余数的值。

65~85分做法

还是用堆来取最大值,其余的数增加可以变成新切开的两个数减少,最后统一加上一个数。

#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define LL long long LL q, u, v;
int n, m, t; std::priority_queue <LL> Q; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} int main()
{
int i;
LL x, y;
n = read();
m = read();
q = read();
u = read();
v = read();
t = read();
for(i = 1; i <= n; i++)
{
x = read();
Q.push(x);
}
for(i = 1; i <= m; i++)
{
if(i % t == 0) printf("%lld ", (LL)Q.top() + (i - 1) * q);
x = (LL)(Q.top() + (i - 1) * q) * u / v;
y = (LL)Q.top() + (i - 1) * q - x;
Q.pop();
Q.push(x - i * q);
Q.push(y - i * q);
}
puts("");
for(i = 1; i <= n + m; i++)
{
if(i % t == 0) printf("%lld ", (LL)Q.top() + m * q);
Q.pop();
}
return 0;
}

100分做法

先排序。

将最大的切成两个小的分别放到另两个队列b和c里。

取最大值的话就从这3个队列的队头找最大的,切完后再放回b和c队列队尾。

这样b和c始终是单调递减。

同样,其余的增加可以换成切出来的另两个减少。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 7000003
#define LL long long
#define max(x, y) ((x) > (y) ? (x) : (y))
#define Max(x, y, z) ((x) > max(y, z) ? (x) : max(y, z)) LL q, u, v, a[N], b[N], c[N];
int n, m, t, t1, t2 = 1, t3 = 1, cnt; inline int read()
{
int x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} int main()
{
int i;
LL x, y;
t1 = n = read();
m = read();
q = read();
u = read();
v = read();
t = read();
a[0] = -(~(1 << 31));
memset(b, -127 / 3, sizeof(b));
memset(c, -127 / 3, sizeof(c));
for(i = 1; i <= n; i++) a[i] = read();
std::sort(a + 1, a + n + 1);
for(i = 1; i <= m; i++)
{
if(i % t == 0) printf("%lld ", Max(a[t1], b[t2], c[t3]) + (i - 1) * q);
if(Max(a[t1], b[t2], c[t3]) == a[t1] && t1 >= 1)
{
cnt++;
x = (a[t1] + (i - 1) * q) * u / v;
y = a[t1] + (i - 1) * q - x;
b[cnt] = x - i * q;
c[cnt] = y - i * q;
t1--;
}
else if(Max(a[t1], b[t2], c[t3]) == b[t2] && t2 <= cnt)
{
cnt++;
x = (b[t2] + (i - 1) * q) * u / v;
y = b[t2] + (i - 1) * q - x;
b[cnt] = x - i * q;
c[cnt] = y - i * q;
t2++;
}
else
{
cnt++;
x = (c[t3] + (i - 1) * q) * u / v;
y = c[t3] + (i - 1) * q - x;
b[cnt] = x - i * q;
c[cnt] = y - i * q;
t3++;
}
}
puts("");
for(i = 1; i <= n + m; i++)
{
if(i % t == 0) printf("%lld ", Max(a[t1], b[t2], c[t3]) + m * q);
if(Max(a[t1], b[t2], c[t3]) == a[t1] && t1 >= 1) t1--;
else if(Max(a[t1], b[t2], c[t3]) == b[t2] && t2 <= cnt) t2++;
else t3++;
}
return 0;
}

  

由这个题可见还是得多挖掘题目给出的性质。

[luoguP2827] 蚯蚓(堆?队列!)的更多相关文章

  1. 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序

    一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使 ...

  2. JS里的居民们4-数组((堆)队列

    编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取 ...

  3. 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)

    容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...

  4. 【NOIP2016】蚯蚓(队列,单调性)

    题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...

  5. luogu 2827 蚯蚓 单调队列/优先队列

    易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bi ...

  6. 洛谷P2827 蚯蚓(单调队列)

    题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...

  7. [noip2016]蚯蚓<单调队列+模拟>

    题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感 ...

  8. 洛谷p2827蚯蚓题解

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

  9. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

随机推荐

  1. http缓存之lastModified和etag

    1.cache-control 访问资源 首次访问页面时间:2018.2.1  9:56  (当前时间=GMT时间+8h) 缓存时长max-age:1 day Expire缓存失效时间:2018.2. ...

  2. 前端组件化(二):优化 DOM 操作

    看看上一节我们的代码,仔细留意一下 changeLikeText 函数,这个函数包含了 DOM 操作,现在看起来比较简单,那是因为现在只有 isLiked 一个状态.由于数据状态改变会导致需要我们去更 ...

  3. JS 事件添加onclick写法注意。

    自定义函数添加onclick事件写法注意. 错误写法:element.onclick = addclass(className); 正确写法:element.onclick = function(){ ...

  4. NBA15-16赛季半程有感

    2015-2016 新赛季NBA已经开打半程又多了,这半个赛季我们见证了 勇士的三节打卡:骑士的磨合反复:马刺的老骥伏枥: 当然还有窝火的XJBD. 豪哥200W刀签约黄蜂,打出来800W刀的身价,无 ...

  5. Spring注解驱动开发之Ioc容器篇

    前言:现今SpringBoot.SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解.原理,比如@Conditional.@Import.@Ena ...

  6. hihocoder offer收割编程练习赛11 C 岛屿3

    思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x ...

  7. swiper4初始化/swiper-init/data-swiper

    用data属性初始化swiper <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  8. TCP/IP 协议、地址

    (一)TCP/IP 协议是端与端之间通信的基础,计算机网络,分组报文,协议是将信息正确传递的组成. 计算机网络: 由多个客户端,中间路由组成的网络体系,每个节点都一个ip进行唯一识别.路由是作为一个转 ...

  9. 键盘工具栏的快速集成--IQKeyboardManager

    转自:http://www.cnblogs.com/gaoxiaoniu/p/5333187.html 键盘工具栏的快速集成--IQKeyboardManager IQKeyboardManager, ...

  10. iOS - - JSON 和 XML解析

    JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...