Frequent values
点击打开链接
题意:给你一段不下降的序列,q个询问,问[l,r]区间内连续出现次数最多的那个数的次数。
思路:
题意很像线段树,考虑用线段树怎么才能计算某个区间 连续出现次数最多的数呢?因为连续出现次数最多的数可能既不在它的左儿子也不在他的右儿子。刚好题目保证了是不减的序列,突破口就在这里,因为如果出现相同的数字,那么它们一定是连续的。所以我们只需要在普通的线段树中加上两个变量用来记录这段区间他的最左边那个数连续数的个数和在最右边那个数连续的个数。在我们求这段区间最大次数,需要多做一次比较(在这段区间的两个子区间中,当左子区间最右边数和右区间最左边的数相等时,取三个数的最大值)。
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct Tree
{int left,right;int maxx,lmaxx,rmaxx;//maxx用来记录这段区间出现最多的次数的个数,//lmaxx用来记录最左边那个数在这段区间连续的数的个数//rmaxx用来记录最右边那个数在这段区间连续数的个数
};
Tree tree[maxn<<2];
int a[maxn];
void build(int id,int l,int r)
{tree[id].left=l;tree[id].right=r;if(l==r){tree[id].maxx=1;tree[id].lmaxx=1;tree[id].rmaxx=1;}else{int mid=(l+r)>>1;build(id*2,l,mid);build(id*2+1,mid+1,r);int tmp;if(a[tree[id*2].right]==a[tree[id*2+1].left]){tmp=tree[id*2].rmaxx+tree[id*2+1].lmaxx;}elsetmp=0;tree[id].maxx=max(max(tree[id*2].maxx,tree[id*2+1].maxx),tmp);tree[id].lmaxx=tree[id*2].lmaxx;//大区间的最左边的那个数和左子区间那个数值相同if(tree[id*2].lmaxx==mid-l+1&&a[tree[id*2].right]==a[tree[id*2+1].left])tree[id].lmaxx=mid-l+1+tree[id*2+1].lmaxx;//判断左子区间里的数是否相同、以及是否等于右子区间最左边的那个数//相同则lmaxx需要变化tree[id].rmaxx=tree[id*2+1].rmaxx;if(tree[id*2+1].rmaxx==r-mid&&a[tree[id*2].right]==a[tree[id*2+1].left])tree[id].rmaxx=r-mid+tree[id*2].rmaxx;//同理}
}
int query(int id,int l,int r)
{if(tree[id].left==l&&tree[id].right==r)return tree[id].maxx;else{int mid=(tree[id].left+tree[id].right)>>1;if(r<=mid)query(id*2,l,r);else if(l>mid)query(id*2+1,l,r);else{int al=query(id*2,l,mid);int ar=query(id*2+1,mid+1,r);int ax=0;if(a[tree[id*2].right]==a[tree[id*2+1].left])ax=min(tree[id*2].rmaxx,mid-l+1)+min(tree[id*2+1].lmaxx,r-mid);return max(max(al,ar),ax);}}
}
int main()
{int n,q,i,l,r;while(scanf("%d",&n)){if(n==0)break;scanf("%d",&q);for(i=1;i<=n;i++)scanf("%d",&a[i]);build(1,1,n);while(q--){scanf("%d%d",&l,&r);printf("%d\n",query(1,l,r));}}
}
Frequent values相关推荐
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...
- UVA 11235 Frequent values(RMQ)
Frequent values TimeLimit:3000Ms You are given a sequence of n integers a1 , a2 , ... , an in non-de ...
- 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意: 有一个单调不降序列,让你求出某些区间内的出现次数最多的数出现的次数(有多组数据,以0结尾) ...
- Frequent values【线段树】
Frequent values UVA - 11235 题目传送门 题目大意:给出一个非降序的整数数组a1,a2,a3...an,你的任务是对一系列的询问(i,j),回答ai,ai+1,ai+2... ...
- POJ 3368 Frequent values 线段树区间合并
题意O(-1)不用解释.. 线段树结点维护三个信息:区间内相同的数出现最多的次数maxc.区间左边第一个数出现的次数lc.区间右边第一个数出现的次数rc. 分左区间右端点和右区间左端点相同于否的情况合 ...
- POJ 3368 Frequent values (RMQ)
题目链接:http://poj.org/problem?id=3368 题目大意: 给出一个n个数长度的串. m个询问 求出给定范围内的最大连续字符串的长度 方法: RMQ模板, 记录每一个位置的数连 ...
- hdu 1806 Frequent values 线段树
题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...
- UVA 11235 - Frequent values
看题传送门 嗯,RMQ问题. 纠结了好久,不过总算弄懂了 @.@ #include<cstdio> #include<algorithm> #include<vector ...
- poj 3368 Frequent values rmq
题意:给你一串数列,然后给你一个起终位置对,问你这个段序列里出现最多的出现了几次. 思路:一段序列里,无非就是三种情况,1,一组相同的数,2两组相同,3,3组或者更多组数,这样我们队每一组数的开头结束 ...
最新文章
- Zookeeper源码分析:Follower角色初始化
- 《Unity 3.x游戏开发实例》一1.5 欢迎来到Unity 3D
- 计算机主机安装系统安装系统,系统重装
- PyQt5基础——3
- windows系统下 VUE cli手脚架环境安装
- rebuild online意外终止导致ora-8104错误的实验
- 模式匹配 怎么匹配减号_如何使您的应用导航与用户的思维模式匹配
- Acwing 307. 连通图
- python历史背景_python学习之旅1-1(python背景、安装介绍)
- android 音乐 数据库,android从数据库中取音乐数据
- LeetCode 310 最小高度树
- PCL点云学习(1)——pcd文件的生成和读取
- java获取pcm格式音频
- 二叉树(知道中序遍历和后序遍历得到先序遍历)
- Robocup3D优化任务布置
- 一张图读懂阿里云数据库架构与选型
- xp系统如何开启ftp服务器,xp系统怎么开ftp服务器
- 学术-几何-维:超级立方体 (五维超级超立方体)
- 学习记录:python选择结构7.15
- push_back()函数的用法
热门文章
- 脉冲神经网络原理及应用pdf_CNN卷积神经网络原理讲解+图片识别应用(附源码)...
- Android TextView设置多样式文本,跑马灯以及霓虹灯效果
- 没有计算机基础可以学python-Python入门必看篇(面向小白)想学Python只看这一篇就够了...
- 开课吧里的python学习是真的吗-做客李晨nic淘宝直播 胡海泉胡彦斌带货开课吧Python...
- python是什么课程-吐血整理!程序员喜爱的13个免费Python课程
- python发音翻译-python实现在线翻译
- vb还是python强大-vb和python哪个速度快
- 语音识别结合应用场景 各位大咖也有一些精彩论点
- 车辆及其应用的车载语音识别显示方法及系统与流程
- PUT与POST的相同点和不同点