P4647 [IOI2007] sails 船帆
由题意可知,这个就是初始有 \(N\) 个为 \(0\) 的变量,有 \(M\) 次操作,让你在前 \(h\) 个里面选 \(k\) 个各 \(+1\)。求 \(\sum_{i=1}^N \frac {x_i \cdot (x_i-1)} 2\) 最小值。
可以发现,操作顺序对最后答案没有影响。
那么我们贪心得使得这 \(k\) 个变得更小更优秀,那么按照 \(h_i\) 排序,那就不用考虑选高处还是低处的问题。然后可以考虑平衡树,因为还需要分裂交换子树,那么考虑 FHQ-Treap。那么我们就可以线找到最小的 \(k\) 个,然后给他们打上tag,接着考虑,这些中的某些数可能大于后面的一段树,那么我还需要按照值把他们分裂后,再合并回去。假定第 \(k+1\) 个数为 \(x\) 那么就会被分成一下段数。
? 1.前 \(k\) 个加了之后小于等于 \(x\) 的。2.前 \(k\) 个加了之后大于 \(x\) 的(也就是 \(x+1\))。3.除了前 \(k\) 个以外的值为 \(x+1\) 的。4.除了前 \(k\) 个以外的大于 \(x+1\) 的。
然后按顺序合并一下,最后dfs一下统计答案就好了。
/*
Name:
Author: Gensokyo_Alice
Date:
Description:
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include