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

一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使之表现的如堆一般. 1.基本使用 heapq.heappush(heap, item) 把一项值压入list(用于表示堆heap),同时维持堆的排序要求,其特性是直接比较入列元素大小(包括入列元素为容器的情况),将大的放在后面. import heapq queue = [] heapq.heapp…
编码1(队头在最右) 练习如何使用数组来实现队列,综合考虑使用数组的 push,pop,shift,unshift操作 基于代码,实现如按钮中描述的功能: 实现如阅读材料中,队列的相关入队.出队.获取队头.判空的操作 队头对应数组中最后一个元素 入队和出队操作后,需要在 id 为 queue-cont 的 p 标签中更新显示队列中的内容,队头在最右侧,中间用 -> 连接(练习使用数组的join方法) <!DOCTYPE html> <html> <head> &l…
传送门 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>…
容易想到的是用二叉堆来解决,切断一条蚯蚓,其他的都要加上一个值,不妨用一个表示偏移量的delta. 1.取出最大的x,x+=delta: 2.算出切断后的两个新长度,都减去delta和q: 3.delta+=q: 将其他长度都加上q不好实现,我们就把新的两条减去p,相对大小关系不变,最后还原即可. 但这还不是正解: 1 //复杂度mlogn,m过大,要超时 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n,m,q,u,v,t; 5…
题目不再重复叙述 请参考: 洛谷 CJOJ 题解 先来说说非完美解法,也是我去年考场上的做法 考虑一下每一只蚯蚓增加的长度, 这个值并不需要每一次依次增加, 用一个变量维护即可,每次取出蚯蚓就加上这个值,切断蚯蚓就减去这个值. 接下来如何维护最大的蚯蚓,考虑使用一个堆来进行维护 时间复杂度O(mlogm)显然超时(其实也就是常数巨大) 现在,来考虑正解 我们先来脑补几个显然成立的结论 第一个:如果蚯蚓A长于蚯蚓B,一定是优先切蚯蚓A 第二个:一只蚯蚓被切断后,两部分长度一定不会超过原长度 第三个…
易知可利用优先队列选取最大值: 但是通过分析可知,先取出的蚯蚓分开后仍然要比后分的长,所以可直接利用单调队列找队头即可,分三个单调队列,分别找未切割,切割,切割2三种情况 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll long long using namespace std; ; ; ; int n,m,q,u,v,t,add; ][M],head[],tail[…
题意 初始时有$n$个蚯蚓,每个长度为$a[i]$ 有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加一个定值$q$. 每次询问被蚯蚓被切前的长度 Sol 用堆模拟可获得$50 - 85$不等的分数. 蚯蚓的长度有单调性.然后这题就做完了... 首先把$a[i]$排序 我们分别维护三个数组$a, b, c$,分别表示未被切的蚯蚓,被切成$p * a[i]$的蚯蚓和被切成$a[i] - p * a[i…
题目链接:https://vijos.org/p/2007 题目链接:https://www.luogu.org/problem/show?pid=2827#sub 说实话当两个网站给出AC后,我很感动....这题啊,思路容易想到,就是小细节太烦了..... [思路] 这道题要开三个队列,而且需要证明到一个点才能够做.. 就是先切的蚯蚓的部分,比后切的蚯蚓的对应部分长...有可能你会想蚯蚓不是随时在长吗,当然这不影响..我们来简单证明一下 ----------------------------…
题目 算法标签里的算法什么的都不会啊 什么二叉堆?? qbxt出去学习的时候讲的,一段时间之前做的,现在才写到博客上的 维护3个队列,队列1表示最开始的蚯蚓,队列2表示每一次被切的蚯蚓被分开的较长的那一部分,队列3表示每一次被切的蚯蚓被分开的较短的那一部分. 我们先把原序列排序,因为不管怎么切,先被切的蚯蚓分成的两部分一定比后切的蚯蚓分成的两部分大 寻找每次切哪一只蚯蚓就是在队列1.队列2.队列3的队头找一个算上增加的长度最大的蚯蚓,之后把他出队,切开的两部分分别进入队2.队3. 最后合并输出…
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下来. 堆(heap) 又被为优先队列(priority queue).尽管名为优先队列,但堆并不是队列.回忆一下,在队列中,我们可以进行的限定操作是dequeue和enqueue. dequeue是按照进入队列的先后顺序来取出元素.而在堆中,我们不是按照元素进入队列的先后顺序取出元素的,而是按照元素…