①:蚯蚓:队列,推公式
https://www.acwing.com/problem/content/135/

蛐蛐国里现在共有 n 只蚯蚓,第 i 只蚯蚓的长度为 ai ,所有蚯蚓的长度都是非负整数,即可能存在长度为 0 的蚯蚓。
每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只,将其切成两段。
若有多只最长的,则任选一只。
神刀手切开蚯蚓的位置由有理数 p 决定。
一只长度为 x 的蚯蚓会被切成两只长度分别为 \(⌊px⌋\)\(x−⌊px⌋\) 的蚯蚓。
特殊地,如果这两个数的其中一个等于 0,则这个长度为 0 的蚯蚓也会被保留。
此外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加一个非负整数 q。
蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要 m 秒才能到来。
蛐蛐国王希望知道这 m 秒内的战况。
输入格式
第一行包含六个整数 \(n,m,q,u,v,t\),其中:\(n,m,q\) 的意义参考题目描述;\(u,v,t\) 均为正整数;你需要自己计算 \(p=u/v\)(保证 \(0<u<v\));\(t\) 是输出参数,其含义将会在输出格式中解释。
第二行包含 \(n\) 个非负整数,为 \(a_{1},a_{2},…,a_{n}\),即初始时 \(n\) 只蚯蚓的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。
输出格式
第一行输出 \(⌊m/t⌋\) 个整数,按时间顺序,依次输出第 \(t\) 秒,第 \(2t\) 秒,第 \(3t\) 秒,……被切断蚯蚓(在被切断前)的长度。
第二行输出 \(⌊(n+m)/t⌋\) 个整数,输出 \(m\) 秒后蚯蚓的长度;需要按从大到小的顺序,依次输出排名第 t,第
\(2t\),第 \(3t\),……的长度。
\(1≤n≤10^5, 0≤ai≤10^8, 0<p<1, 0≤q≤200, 0≤m≤7∗10^6, 0<u<v≤10^9, 1≤t≤71\)

题目挺长的,我们通读一遍题目,就可以知道我们需要维护一个序列\(X\),并且序列\(X\)能够做以下操作

①将最大的值分为\(⌊px⌋\)\(x−⌊px⌋\)两个值
②对于其他未操作的值,我们均加上\(q\).

我们可以这么想,对于每一个值我们放入一个优先队列中,我们每次取最大值,分解为两个小值放入优先队列中,重复\(m\)次即可求出答案。对于其余数的变化如何操作呢,我们只要在插入值时减去\(q\),又在最后对每一个值加上\(m*q\)即可。
时间复杂度为\(O(m\log_2x)\)
但是!!!!!
这个题目的数据范围实在是太大了,尤其是\(m\),利用优先队列会炸的。
我们通过上述加数的过程进行了优化,我们现在考虑对于寻找每一个最大值的优化,使其复杂度不依赖于\(m\)
以下就是神仙才想出来的推公式:我不会,我爬
我们记每一个值所分出来的小值为\(l\),大值为\(r\)
算法竞赛进阶指南_打卡_题解_0x10_输出格式
算法竞赛进阶指南_打卡_题解_0x10_复杂度_02

上面公式就是说,每一次分得的值一定比之前分得的值小,无论大值还是小值。
因此即使我们利用普通的队列来存也能够保证单调下降,并且\(q.front()\)即为最大值。
拥有上述推导后,我们即可在\(O(m+n\log_2n)\)的时间内得出答案。