[luoguP2827] 蚯蚓(堆?队列!)
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] 蚯蚓(堆?队列!)的更多相关文章
- 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序
一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使 ...
- JS里的居民们4-数组((堆)队列
编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取 ...
- 洛谷P2827 [NOIP2016 提高组] 蚯蚓 (二叉堆/队列)
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.del ...
- 【NOIP2016】蚯蚓(队列,单调性)
题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个 ...
- luogu 2827 蚯蚓 单调队列/优先队列
易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bi ...
- 洛谷P2827 蚯蚓(单调队列)
题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加 ...
- [noip2016]蚯蚓<单调队列+模拟>
题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感 ...
- 洛谷p2827蚯蚓题解
题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那 ...
- python数据结构之堆(heap)
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
随机推荐
- 首先定义一个5X8的二维数组,然后使用随机数填充满。借助Arrays的方法对二维数组进行排序。
package day02; import java.util.Arrays; import java.util.Random; public class Test01 { public static ...
- 【JavaScript】随机生成10个0~100的数字
随机生成10个0~100不重复的数字(包含0和100): 需要用到的知识点:随机数 去重 下面放代码 <!DOCTYPE html> <html> <head> & ...
- 移动设备访问使用百度js跳转
以下为代码,可放置在网站foot底部文件,或者haead顶部文件,建议将代码放在网站顶部,这样可以实现手机访问立即跳转! <script src="http://siteapp.bai ...
- H.264和HEVC分析软件和工具【转】
一.264分析两大利器:264VISA和Elecard StreamEye Tools 264visa 强力的h264实时分析工具 ,能分析各种场合下的h264资源,适用于h264开发者,学习者.在图 ...
- 【译】x86程序员手册34-9.7错误代码
9.7 Error Code 错误代码 With exceptions that relate to a specific segment, the processor pushes an error ...
- PHP正则表达式考察点
正则表达式的作用 分隔.查找.匹配.替换字符串 正则表达式的组成部分 分隔符 "/" . "#" . "~" 通用原子 \d : 十进制的0 ...
- Ryubook_1_switch_hub_部署执行
一.环境: mininet.ovs.Ryu. 二.实验过程: 1.搭建拓扑: 执行sudo mn --topo single,3 --mac --switch ovsk --controller re ...
- Python_高阶函数、装饰器(decorator)
一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...
- cmanformat - 不是命令啦,是个演示文件
描述 DESCRIPTION cmanformat 是 man pages 格式的演示文件. 由于系统不同会有差异.在 XWindow 下会好些. __________________________ ...
- SolidWorks的文件类型
零件模板 *.prtdot装配体模板 *.asmdot工程图模板 *.drwdot颜色文件 *.sldclr曲线文件 *.sldcrv复制设定向导文件 *.sldreg零件文件:prt sldprtF ...