111
T1 花海(flower)
30分
暴力枚举\(i_1,j_1,i_2,j_2\),暴力求和,时间复杂度\(O(n^5)\)
50分
暴力枚举\(i_1,j_1,i_2,j_2\),前缀和快速求和,时间复杂度\(O(n^4)\)
100分
不妨设\(n\le m\) ,那么\(n\le \sqrt {2\times 10^5}\)
枚举\(i_1,i_2,j_1\),我们需要求出\(j_2>j_1\)使得前缀和最大,这可以通过倒着枚举\(j_1\),更新\(j_2\)实现
总时间复杂度\(O(n ^2m)\)
T2 划分(split)
20分
暴力枚举
40分
令\(f_i\)表示\(1-i\)的划分的最大值和最小值
100分
优化dp
后面的约束条件可以通过单调队列解决
固定\(i\)
前面这部分,\(f_j\)是单调不降的,\(Max_{k=j}^{i}a_k\)是单调不增的
对于每一个不同的\(Max_{k=j}^{i}a_k\),我们发现\(f_{j-1}+Max_{k=j}^{i} a_k\)都在\(j\)最小值处取到最小值,而\(f_j\)不变
我们可以再开一个单调队列,来维护\(max_{k=j}^{i}a_k\)
然后对于每一个队列中的元素统计他们的最小值,就可以得到\(f_i\)
我们需要求最小值、修改元素、删除元素,可以用multiset维护
时间复杂度\(O(nlgn)\)
T3 落子无悔
30分
暴力搜索
100分
题目要求我们自顶向下删除,我们可以将这个过程反过来,自底向上合并
对于节点\(x\),其子节点为\(y_1,y_2,..,y_k\)假设已经合并出序列,我们将这些序列重组,对于顺序的决定,我们可以采用贪心,通过微扰法我们发现,我们需要将他们按照\(\frac{s_0(y)}{s_1(y)}\)从大到小排序即可,\(s_k(y)\)表示\(y\)的序列中\(k\)的数量
放眼全局,选了\(x\),接下来我们选\(x\)的儿子\(y_1\),我们不妨将\(x\)和\(y_1\)绑在一起,看作一个新的连通块
这样,每次我们按照\(\frac{s_0(y)}{s_1(y)}\)从大到小,将\(y\)合并到父亲\(x\)上
我们需要每次求出最小值、弹出最小值、对元素进行修改,所以我们可以采用堆或者平衡树
合并我们可以通过并查集实现。
时间复杂度\(O(nlgn+\alpha n)\)
T4 游乐园
30分
暴力搜索
50分
如果每个右端点不一样,可以通过每次取右端点构造一个方案
反之
我们来构造一个右端点不一样的区间
对右端点从大到小排序,得到{r1,r2,……},对于相同的r,可以将他们变成{r,r-1,r-2……},这便得到了最优的右端点序列
一个很显然的想法,让左端点较小的区间有较小的右端点显然更优
然后开始分配右端点,按左端点从大到小排序后,每次取离r最近且<=r的右端点,顺便判Sorry
这可以用set实现
100分
先按50分方式处理
显然一定存在一个答案最小的区间每次选择的点都是右端点(调整法)
之后按右端点从小到大选择必须的
每次找出左端点小于等于当前右端点的全部区间,按不同的种类删去右端点最小的区间,可以用set维护
时间复杂度为 \(O(nlgn)\)

浙公网安备 33010602011771号