洛谷 P5012 水の数列
Problem
给你一个长度为\(n(n\le10^6)\)的数列,有\(T(T\le 10^3)\)组询问,每一组询问查询区间\([l,r]\),请选择一个\(x\),将所有\(\le x\)的数标记后得到的段数\(\in[l,r]\),得分为每一段连续标记的区间的长度的平方和除以\(x\),最大化得分。
\(0\le a_i\le 10^6\).
强制在线。
Solution
注意到没有修改,那么就可以愉快的预处理。
首先从小到大枚举\(x(1\le x\le 10^6)\)同时用并查集维护连通性,计算答案为\(x\)时有多少段,得分是多少。
把这个\((得分,x)\)二元组放到一个数组中(下标为段数),用线段树维护即可。
结果大概可能是像我一样辛辛苦苦打完线段树,发现线段树无论如何都会\(MLE\)……线段树的空间复杂度是\(4\times n\)左右,而分块的空间复杂度只有\(n+\sqrt{n}\),于是换成分块就可以愉快的AC啦!这是一种时间换空间的方法。
Code
代码实属远古且肉麻,见谅。
/**************************************************************
* Problem: 5012
* Author: Vanilla_chan
* Date: 20210331
* E-Mail: Vanilla_chan@outlook.com
**************************************************************/
#include
#include
#include
#include
#include
#include
#include
Other
如果您最后一排\(RE\)/全\(WA\),除了在计算数组大小,检查算法的正确性,别忘记看看加密方式QAQ
还有,记得多%
。
时隔几个月,在大家的帮助下(见讨论区)终于完成了历史性的突破,\(95pts\to AC\),通过了这道题。
无可奈何花落去,似曾相识燕归来。小园香径独徘徊。