[USACO17DEC]Milk Measurement S

本文介绍了USACO2017年12月竞赛中的Milk Measurement S题目,涉及奶牛产奶量变化及求解产奶量最高奶牛变化次数的问题。通过离散化和区间维护策略解决,特别处理了题目中可能存在的特殊情况,如仅记录一头奶牛的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[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 +
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值