[线段树]hdu 2430 Beans

该博客介绍了如何使用线段树数据结构解决一道算法题,HDU 2430 Beans。题目要求在给定序列中找到最大连续子序列和,满足子序列和对p取模后小于等于k。博主通过建立模p的线段树,维护每个范围内最小的id值,从而在O(n log p)的时间复杂度内求解问题。
摘要由CSDN通过智能技术生成
/**
[线段树]hdu 2430 Beans
给出一系列数,求最大的连续子段和且满足sigma % p <= k
10^6,只能想Nlog(N)的算法。
分别枚举以i结尾的子段的最优值,则使得sum[i] - sum[id]最大即是使id最小。
问题转化为了求最小id。
易知,满足条件的sum[id] % p 的范围 为 [sum[i] % p - k,sum[i] % p],
所以对取模后的结果建树,维护里面最小的id值。
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define N 1000002
#define INF 10000000
#define L(i) (i) << 1
#define R(i) (i) << 1 | 1
struct _st
{
    int l,r,Min;
    int mid()
    {
        return (l + r) >> 1;
    }
}st[N<<2];
void build(int id,int l,int r)
{
    st[id].l = l;
    st[id].r = r;
    st[id].Min = INF;
    if(l == r)
        return;
    int mid = st[id].mid();
    build(L(id),l,mid);
    build(R(id),mid
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值