2019-07-31  2024-09-15    291 字  1 分钟
CF
- HDU

HDU-6608 Find the answer

题意:Q组样例。每组给出n、m,接下来一行n个数a[i]。对于每个 $math_inline$i\in[1, n]$math_inline$ ,输出需要删除最少的个数,使得 $math_inline$\sum_{j=1}^{i-1}a[i]\leq m$math_inline$

对于每个i,删除最少个数 = i-1-留下的最多的个数。我们建一个权值线段树,因为 $math_inline$q\leq w[i] \leq 10^9 且 1 \leq n \leq 2 \times 10^5$math_inline$ ,所以需要离散化。

我们能留下的数的和最大为m-a[i]。那么题目转化为用最多的权值线段树中的数凑出m-a[i]这个数。

那么我们凑的时候,如果左子树上的数的和已经够用,那么肯定只用左子树上的数;否则我们肯定要全用左子树上的数+右子树凑出 m-a[i]-左子树上数的和。

注意当递归到叶节点时,那么表明我们只能用这个数去凑val,取 $math_inline$\text{min}\left(\text{tree[cur].num}, \frac{\text{val}}{\text{b[tree[cur].l]}}\right)$math_inline$ 即可。查询完再更新个数即可


Code
cout << "Hello World" << endl;