题目大意
洛谷链接
给出(n)条蚯蚓,给出(m)秒,每一秒都把蚯蚓中最长的蚯蚓分成两段,一段是原来的(p)倍,剩下的就是((1-p))倍。每一秒,除了刚刚产生的两条新蚯蚓,其余蚯蚓长度都会增加一个非负整数(q)。
非整数均向下取整。
输入格式
第一行包含六个整数(n,m,q,u,v,t),其中:(n,m,q) 的意义见【问题描述】;
(u,v,t)均为正整数;
你需要自己计算(p=u/v)(保证(0<u<v));
(t)是输出参数,其含义将会在【输出格式】中解释。
第二行包含 (n)个非负整数,为(a_1,a_2,dots,a_n),即初始时 (n) 只蚯蚓的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。
数据范围
(1leq nleq 10^5,0leq mleq 7 imes 10^6,0<u<vleq 10^9,0leq qleq 2000,1leq tleq 71,0leq a_ileq 1)。
输出格式
第一行按时间顺序输出每一秒被切断蚯蚓在切断前的长度。
第二行输出(m)秒后从大到小每条蚯蚓的长度。
同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要输出,也应输出一个空行。
思路
首先看到题可以有一种很暴力的方法就是用优先队列直接取队首暴力,但是显然不行,因为剪短一条蚯蚓别的蚯蚓还会长大。
可以想到的是区间修改。不过这个区间一定是不算最大的那个之外所有的,所以为了简单一点,可以考虑只修改最大的那个蚯蚓。每一次记录一下增加的长度,最后再加。至于最大的不用加的那个,直接减去需要加的数就可以了,这样还不影响排序。
不过实测这样会T,而且我T疯了(正好对应分享题题号T老姚太强了orz)
然后就优化,可以看出,一开始将蚯蚓的长度排好序后,因为每次切断的比例是一定的,所以最大的蚯蚓切断后形成的两条蚯蚓各自一定大于等于第二大的蚯蚓切断形成的两条蚯蚓。
所以切出来的两条蚯蚓再分别放在两个数组中sort一下,这样就变成了三个数组。每次切的时候找三个数组中最大的切就好了。
(据说用STL的话会T,各位可以试试。)