/**
[线段树]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
[线段树]hdu 2430 Beans
最新推荐文章于 2021-01-28 18:21:49 发布
该博客介绍了如何使用线段树数据结构解决一道算法题,HDU 2430 Beans。题目要求在给定序列中找到最大连续子序列和,满足子序列和对p取模后小于等于k。博主通过建立模p的线段树,维护每个范围内最小的id值,从而在O(n log p)的时间复杂度内求解问题。
摘要由CSDN通过智能技术生成