一、题面

POJ3368

二、分析

仍然是一道只需要区间查询不需要区间修改的线段树题。

这题的题面比较特别,它是一组非减的数组。当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可以用线段树维护区间内出现的最大次数时,同时维护两端的数字出现的次数。这样,就可以在建树的时候通过判断可能的左右子树最大值和(左子树的最右端的数的次数+右子树的最左端的数的次数),括号出现的前提是左子树维护的区间右端点的数与右子树维护的区间左端点的数相等。

保证建树建成功后,就是基本的查询了,但是需要注意的是,当mid在要查询的区间内时,因为查询的区间跨了线段树的两个区间,所以当左子树维护的右端点的值和右子树的左端点的值相等时,需要与当前最大值进行比较。

二刷这题后,补充一下,初始化的问题,每组样例过后,记得对线段树的一些标记是改变了的。

三、AC代码

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = 1e5; struct Node
{
int l, r;
int cntl, cntr, Max;
}segTree[MAXN<<];
int Data[MAXN], Ans; void Build(int v, int L, int R)
{
segTree[v].l = L;
segTree[v].r = R;
if(L == R)
{
segTree[v].Max = ;
segTree[v].cntl = segTree[v].cntr = ;
return;
}
int mid = (L + R) >> ;
int lc = v<<, rc = v<<|;
Build(lc, L, mid);
Build(rc, mid + , R);
int sum = ; //初始化别忘了
if(Data[segTree[lc].r] == Data[segTree[rc].l])
{
sum = segTree[lc].cntr + segTree[rc].cntl;
}
if(segTree[lc].Max > segTree[rc].Max)
segTree[v].Max = segTree[lc].Max;
else
segTree[v].Max = segTree[rc].Max;
segTree[v].Max = max(segTree[v].Max, sum);
segTree[v].cntl = segTree[lc].cntl;
segTree[v].cntr = segTree[rc].cntr;
if(Data[segTree[v].l] == Data[segTree[rc].l])
{
segTree[v].cntl += segTree[rc].cntl;
}
if(Data[segTree[v].r] == Data[segTree[lc].r])
{
segTree[v].cntr += segTree[lc].cntr;
}
} void Query(int v, int L, int R)
{
if(Ans >= segTree[v].Max)
return;
if(segTree[v].l == L && segTree[v].r == R)
{
Ans = max(Ans, segTree[v].Max);
return;
}
int mid = (segTree[v].l + segTree[v].r)>>;
if(L > mid)
{
Query(v<< | , L, R);
}
else if(R <= mid)
{
Query(v<<, L, R);
}
else
{
Query(v<<, L, mid);
Query(v<< | , mid + , R);
int temp = ;
if(Data[mid] == Data[mid + ])
{
temp = min(segTree[v<<].cntr, mid - L + );
//为什么要考虑mid-L+1,因为可能所插叙的区间并没有完全包含所有的这个数
temp += min(segTree[v<<|].cntl, R - mid);
}
Ans = max(Ans, temp);
}
} int main()
{
//freopen("input.txt", "r", stdin);
int N, Q;
while(scanf("%d", &N) == && N)
{
scanf("%d", &Q);
int L, R;
for(int i = ; i <= N; i++)
scanf("%d", &Data[i]);
Build(, , N);
for(int i = ; i < Q; i++)
{
Ans = -MAXN;
scanf("%d %d", &L, &R);
Query(, L, R);
printf("%d\n", Ans);
}
}
}

POJ_3368 Frequent values 【线段树+区间查询】的更多相关文章

  1. HDOJ-1806 ( Frequent values ) 线段树区间合并

    http://acm.hdu.edu.cn/showproblem.php?pid=1806 线段树维护区间出现频率最高的出现次数.为了维护上者,需要维护线段前后缀的出现次数,当和其他线段在端点处的字 ...

  2. UVA 11235 Frequent values 线段树/RMQ

    vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...

  3. POJ 3368 Frequent values 线段树与RMQ解法

    题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...

  4. POJ3368(Frequent values)--线段树

    题目在这里 3368 Accepted 7312K 1829MS C++ 6936B 题意为给你一组数据,再给定一组区间,问你这个区间内出现次数最多的元素的次数是多少. 我还记得这题是学校校赛基础的题 ...

  5. hdu 1806 Frequent values 线段树

    题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...

  6. HDU 1754 I Hate It(线段树区间查询,单点更新)

    描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...

  7. POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】

    一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...

  8. ACM_最值差(线段树区间查询最值)

    最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...

  9. HDU 4614 Vases and Flowers(二分+线段树区间查询修改)

    描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...

随机推荐

  1. 手工创建Oracle数据库

    数据库版本: SQL> select * from v$version; BANNER ----------------------------------------------------- ...

  2. mybatis常用方法总结

    mybatis的强大特性之一就是动态SQL.我们在写复杂查询的时候,会发现复杂查询包括了各种各样的判断,我们很难一鼓作气的写出完美的查询.动态SQL语句可以帮助我们拼接不同的SQL语句,而已让我们的代 ...

  3. jquery UI datepicker汉化

    由于近期工作需要,jquery ui的datepicker需要汉化,特此把代码贴在这$(function() { $.datepicker.regional["zh-CN"] = ...

  4. http post 方法传递参数的2种方式

       1.StringEntity try{ HttpPost httpPost = new HttpPost(url); //param参数,可以为param="key1=value1&a ...

  5. web测试——完结感言

    1.在小组所有成员一人找出了博客园的2个小bug. 2.杨瑞丰与李建文完成了用户调研和定量评价. 3.张颖与汪鸿也完成了产品分析和与CSDN的横向比较. 4.胡俊辉一个人总结所有人的问题与结果,进行了 ...

  6. MySQL 存储过程 -流程控制的使用

    #五.流程控制的使用 #1.IF 使用 create PROCEDURE iftest1() BEGIN DECLARE a int DEFAULT 10; -- IF (a>1 &&a ...

  7. 数据库SQL优化大总结之 百万级数据库优化方案(转)

    出处:http://www.cnblogs.com/yunfeifei/p/3850440.htm 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不 ...

  8. UVa 11324 The Largest Clique (强连通分量+DP)

    题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...

  9. SpringMVC源码解读 - RequestMapping注解实现解读 - RequestMappingInfo

    使用@RequestMapping注解时,配置的信息最后都设置到了RequestMappingInfo中. RequestMappingInfo封装了PatternsRequestCondition, ...

  10. 探索式软件测试—Exploratory Software Testing

    最近找到去年上半年看过一本关于测试方面书籍的总结笔记,一直放在我的个人U盘里,当时是用Xmind记录的,现在重新整理下分享给大家了! James A.Whittaker [美] 詹姆斯·惠特克(软件测 ...