/**
一个非降的数组,求区间[i,j]中的最大频度
一道求区间内最大值的线段树,只不过这个最大值是经过处理获得的。
a[i] 原数组
sub[i] 表示原数组下标i在线段树中的位置
seg[i] 即线段树中叶子的值,也就是要查询的最大值所在的数组
所表示的值是原数组中第i段相等值得个数。
样例:
10 3
-1 -1 1 1 1 1 3 10 10 10
缩数组为
下标 1 2 3 4
个数 2 4 1 3
特殊情况处理,要查询的区间可能只有部分数在线段树中,例如[2,4],
这时踢出两个1,即查询[2,2]
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
#define N 110000
#define L(i) i << 1
#define R(i) i << 1 | 1
int sub[N],seg[N],n;
int a[N];
struct _st
{
int l,r,maxx;
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;
int mid = st[id].mid();
if(l == r)
{
st[id].maxx = seg[l];
return ;
}
build(L(id),l,mid);
build(R(id),mid+1,r);
st[id].maxx = max(st[L(id)].maxx,st[R(id)].maxx);
}
int query(int id,int l,int r)
{
if(st[id
poj 3368 Frequent values#线段树
最新推荐文章于 2018-05-17 16:55:23 发布