[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):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
随机推荐
- 题解报告:hdu 1098 Ignatius's puzzle
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1098 题目中文是这样的: 伊格内修斯在数学上很差,他遇到了一个难题,所以他别无选择,只能上诉埃迪. 这 ...
- Ubuntu下编译安装MySQL5.7
tar zxvf mysql-5.7.14.tar.gz cd mysql-5.7.14 第一步: cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \ ...
- Jquery操作常用表单元素
由于对前端的东西不是很熟练,导致jquery操作表单的东西总是忘记,每次用都要查一下,效率低下,记录下来,以便下次使用. CheckBox checkbox改变事件 $('#IsAllSearch') ...
- mysql之通过cmd连接远程数据库
---恢复内容开始--- 目录 前提 连接远程数据库 前提: 本地安装了mysql数据库 本地和远程网络是连通的,通过命令ping ip (即ping 192.168.0.333),可以ping通 连 ...
- mysql之流程控制
目录 分支结构 循环结构 分支结构: 1.if condition then [statement] elseif condition then [statement] else [statement ...
- LN : leetcode 123 Best Time to Buy and Sell Stock III
lc 123 Best Time to Buy and Sell Stock III 123 Best Time to Buy and Sell Stock III Say you have an a ...
- 老潘 - ListView分析 - 学以致用篇(一)
ListView分析学以致用篇(1) 在我们查看别人的博客的时候,一个人是一个风格的.先说下我的风格,我喜欢思想类比,然后介绍知识,不太喜欢填鸭式的灌输.如果只是想单纯的从我的博客中直接看到代码,我个 ...
- spark性能优化(包括优化原理及基本方法)
https://www.jianshu.com/p/b8841a8925fb spark性能优化 1.诊断内存的消耗 2. 高性能序列化类库 3. 优化数据结构 4. 对多次使用的rdd进行持久化或者 ...
- 架构(Architecture)随想
架构(Architecture)的意义: 先不要看什么是架构,先看下architect是什么,没有错,它是建筑师,在一块空地上build高楼大厦的人,它是一个designer,设计好整个大楼,也是一个 ...
- 字符串(String)几个常用方法的详解
String:(字符串) indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. stringObject.indexOf(searchvalue,fromindex) searc ...