题目大意

洛谷链接

给出\(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\) 只蚯蚓的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。

数据范围

\(1\leq n\leq 10^5,0\leq m\leq 7\times 10^6,0<u<v\leq 10^9,0\leq q\leq 2000,1\leq t\leq 71,0\leq a_i\leq 1\)。

输出格式

第一行按时间顺序输出每一秒被切断蚯蚓在切断前的长度。

第二行输出\(m\)秒后从大到小每条蚯蚓的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要输出,也应输出一个空行。

思路

首先看到题可以有一种很暴力的方法就是用优先队列直接取队首暴力,但是显然不行,因为剪短一条蚯蚓别的蚯蚓还会长大。

可以想到的是区间修改。不过这个区间一定是不算最大的那个之外所有的,所以为了简单一点,可以考虑只修改最大的那个蚯蚓。每一次记录一下增加的长度,最后再加。至于最大的不用加的那个,直接减去需要加的数就可以了,这样还不影响排序。

不过实测这样会T,而且我T疯了(正好对应分享题题号T老姚太强了orz)

然后就优化,可以看出,一开始将蚯蚓的长度排好序后,因为每次切断的比例是一定的,所以最大的蚯蚓切断后形成的两条蚯蚓各自一定大于等于第二大的蚯蚓切断形成的两条蚯蚓。

所以切出来的两条蚯蚓再分别放在两个数组中sort一下,这样就变成了三个数组。每次切的时候找三个数组中最大的切就好了。

(据说用STL的话会T,各位可以试试。)

最新文章

  1. iOS 开发总结(上)
  2. 1116Xlinux初学习之正则表达式和通配符
  3. GMM简单解释
  4. FlashBuilder使用
  5. mongo学习笔记(六):linux上搭建
  6. Effective Objective-C 2.0之Note.02
  7. Ubuntu下配置smb服务器
  8. maven Spring MVC项目
  9. zk create() 方法
  10. HTML 速成
  11. linux中的软连接和硬连接
  12. 简单的同步Socket程序服务端
  13. vscode常用快捷键
  14. ezdxf包下autocad的开发
  15. Uncaught RangeError: Maximum call stack size exceeded 超出最大调用值
  16. 1.docker 数据卷的备份和恢复(非大数据量)
  17. IDEA 简单的正则匹配
  18. java导入、导出Excel文件
  19. 【Codeforces 113B】Petr#
  20. JQuery 知识

热门文章

  1. Appium之启动第一个App
  2. oracle之DML和DDL语句的其他用法
  3. python守护线程t.setDaemon(True)
  4. 居然仅用浏览器,就完成了Spring Boot应用的开发与部署!
  5. 第二篇 配置wcf
  6. 【转】Postgres SQL sort 操作性能调优
  7. pytest封神之路第六步 断言技巧
  8. 自定义带边框TextView--边框粗细不一的问题
  9. 你来讲讲AQS是什么吧?都是怎么用的?
  10. 深入理解Callable接口