[USACO17DEC]Milk Measurement S
题意
有n头牛,每头牛的初始产奶量是m,接下来n行,每一行有三个数,分别表示日期,牛奶的编号,产奶量的变化之,表示在这天,这个编号的奶牛的产奶量会变化,现在问你最终,产奶量最高的奶牛的变化次数。(数量或者产奶量最高的奶牛编号的变化)
思路
离散化+线段树
首先奶牛的编号为1-1e9,那么肯定对于编号我们要使用离散化。
对于一个区间我们要维护那些之呢: 首先肯定要有这个区间里面的最大值maxn,并且还要走最大值的个数cnt,首先,我们每次只会有一头奶牛的产奶量在改变,最大值的改变肯定会使答案改变,数量的增加也会是答案改变,还有就是最大值的编号改变也会值答案改变,所以我们还需要一个记录最大产奶量的奶牛的编号ran。
接下俩看一下pushup:
void pushup(int u)
{
if (tr[u << 1].maxn > tr[u << 1 | 1].maxn)
{
tr[u].cnt = tr[u << 1].cnt;
tr[u].maxn = tr[u << 1].maxn;
tr[u].ran = tr[u << 1].ran;
}
else if (tr[u << 1 | 1].maxn > tr[u << 1].maxn)
{
tr[u].cnt = tr[u << 1 | 1].cnt;
tr[u].maxn = tr[u << 1 | 1].maxn;
tr[u].ran = tr[u << 1 | 1].ran;
}
else
{
tr[u].cnt = tr[u << 1].cnt + tr[u << 1 | 1].cnt;
tr[u].maxn = tr[u << 1].maxn;
tr[u].ran = tr[u << 1].ran;
}
}
对于一个节点,我们更新它的值的时候,如果最大值在它的左儿子,那么它的左右信息都等效于它的左儿子,右儿子同理,特殊的,如果左右儿子都含有最大值,那么我们将编号默认在左儿子,这样我们在后续判断最大产奶量的奶牛的编号的时候就很好判断了。
在接下来分析一下离散化的过程
sort(edge + 1, edge +