POJ_3368 Frequent values 【线段树+区间查询】
一、题面
二、分析
仍然是一道只需要区间查询不需要区间修改的线段树题。
这题的题面比较特别,它是一组非减的数组。当需要去找一段区间内出现次数最多的数字时,这些数字必然是连续的,那么就可以用线段树维护区间内出现的最大次数时,同时维护两端的数字出现的次数。这样,就可以在建树的时候通过判断可能的左右子树最大值和(左子树的最右端的数的次数+右子树的最左端的数的次数),括号出现的前提是左子树维护的区间右端点的数与右子树维护的区间左端点的数相等。
保证建树建成功后,就是基本的查询了,但是需要注意的是,当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 【线段树+区间查询】的更多相关文章
- HDOJ-1806 ( Frequent values ) 线段树区间合并
http://acm.hdu.edu.cn/showproblem.php?pid=1806 线段树维护区间出现频率最高的出现次数.为了维护上者,需要维护线段前后缀的出现次数,当和其他线段在端点处的字 ...
- UVA 11235 Frequent values 线段树/RMQ
vjudge 上题目链接:UVA 11235 *******************************************************大白书上解释**************** ...
- POJ 3368 Frequent values 线段树与RMQ解法
题意:给出n个数的非递减序列,进行q次查询.每次查询给出两个数a,b,求出第a个数到第b个数之间数字的最大频数. 如序列:-1 -1 1 1 1 1 2 2 3 第2个数到第5个数之间出现次数最多的是 ...
- POJ3368(Frequent values)--线段树
题目在这里 3368 Accepted 7312K 1829MS C++ 6936B 题意为给你一组数据,再给定一组区间,问你这个区间内出现次数最多的元素的次数是多少. 我还记得这题是学校校赛基础的题 ...
- hdu 1806 Frequent values 线段树
题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...
- HDU 1754 I Hate It(线段树区间查询,单点更新)
描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...
- POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】
一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...
- ACM_最值差(线段树区间查询最值)
最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...
- HDU 4614 Vases and Flowers(二分+线段树区间查询修改)
描述Alice is so popular that she can receive many flowers everyday. She has N vases numbered from 0 to ...
随机推荐
- 设计模式(java)--中介者模式之同事的关联
转自:http://blog.csdn.net/zhengzhb/article/details/7430098 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使 ...
- back propogation 的线代描述
参考资料: 算法部分: standfor, ufldl : http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial 一文弄懂BP:https: ...
- Ubuntu14.04下使用PPA安装php5.6,php7
1.为了使用ppa(Personal Package Archives) 选安装依赖: # apt-get install python-software-properties 2.添加不同版本php ...
- Lucene.Net(转)
出处:http://www.cnblogs.com/piziyimao/archive/2013/01/31/2887072.html 做过站内搜索的朋友应该对Lucene.Net不陌生,没做过的也许 ...
- Java Project 转 Dynamic Web Project
使用eclipse 工具, 右键Java Project 项目 Properties - Project Facets - Convert to faceted form... - 勾选Dynami ...
- 慎用WSACleanup()
中止Windows Sockets DLL的使用. #include <winsock.h> int PASCAL FAR WSACleanup ( voi ...
- kafka (搜索) 在idea api操作(官方apihttp://kafka.apache.org/documentation/#producerapi)
https://blog.csdn.net/isea533/article/details/73822881 这个不推荐,可以看一下(https://www.cnblogs.com/b ...
- 基于 Web 的数据挖掘--自动抽取用 HTML、XML 和 Java 编写的信息
简介: 不可否认,万维网是到目前为止世界上最丰富和最密集的信息来源.但是,它的结构使它很难用系统的方法来利用信息.本文描述的方法和工具将使那些熟悉 Web 最常用技术的开发人员能快速而便捷地获取他们所 ...
- TunnelBroker for EdgeRouter 后记
最近入手了UBNT EdgeRouter X, 想着用 IPv6在路由上FQ,经过两天折腾,终于正常使用,留下点标记 供后来同学借鉴. TUNNEL的注册和配置,可以完全按这篇文章来: TunnelB ...
- 常用SQL语句集锦
MySQL适用 1.如图所示,根据Coord字段内容填充X/Y字段,并调整Coord字段格式(Coord字段原为[Latitude,Longitude]格式,需要将其调整为[Longitude,Lat ...