[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):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
随机推荐
- 数学 Codeforces Round #308 (Div. 2) B. Vanya and Books
题目传送门 /* 水题:求总数字个数,开long long竟然莫名其妙WA了几次,也没改啥又对了:) */ #include <cstdio> #include <iostream& ...
- 题解报告:NYOJ 题目143 第几是谁?(逆康托展开)
描述 现在有"abcdefghijkl”12个字符,将其按字典序排列,如果给出任意一种排列,我们能说出这个排列在所有的排列中是第几小的.但是现在我们给出它是第几小,需要你求出它所代表的序列. ...
- 题解报告:hdu 2094 产生冠军
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2094 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打 ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- Suricata的所有运行方式模式(图文详解)
不多说,直接上干货! suricata的基本组成.Suricata是由所谓的线程(threads).线程模块 (thread-modules)和队列(queues)组成.Suricata是一个多线程的 ...
- Anaconda(miniconda)安装及使用--转
https://www.waitalone.cn/anaconda-install-error.html 3,224 1.Anaconda概述 Anaconda是一个用于科学计算的 ...
- AJPFX关于异常和file类的总结
/** * 各位坛友注意啦!对我这个帖子有任何的疑惑的,可以尽管留帖提问,我会在看到的第一时间回贴,既然写得出这帖子,* 就要对看这帖子的人负责,所以有问题,尽管问!* * * 这块没学好的同学,可以 ...
- VUE学习,is 特性,转载来源:https://segmentfault.com/q/1010000007205176/
- NavigationView的使用
代码已经分享至github:https://github.com/YanYoJun/NavigationDemo 转载请注明原文链接:http://www.cnblogs.com/yanyojun/p ...
- oracle 安装,启动 ,plsql 连接
1.下载oracle 服务器端,正常安装,在选择桌面类或者是服务器类的时候选择服务器类. 2.下载oracle 客户端解压版 下载地址 链接:https://pan.baidu.com/s/1mi ...