POJ 3368 (ST表)
链接:http://poj.org/problem?id=3368
题意:给出n个连续单调不递减数,q次询问,每次询问区间(L,R)出现频率最多的数,问出现了多少次
思路:因为n个数是单调不递减的,所以可以预处理一个频率数组cnt[ ],cnt[ i ]记录某个数到 i 位置时,出现了多少次,再预处理一个index数字,记录每一段相同的数字,最右端的位置,因为每次询问的时候可能会出现一部分连续的数被L这个位置隔开,cnt[i]只记录了某个数到i位置出现了多少次,被隔开的部分多算了,所以需要减去,每次询问(L,R)的时候分为两个部分,前一部分查询出 index[ L ] - l为被隔开的部分,后一部分用st表维护区间最值求即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn = ;
int n,q;
int a[maxn];
int cnt[maxn];
int index[maxn];
int Log[maxn];
int f[maxn][];
void pre(){
Log[] = ;
Log[] = ;
for(int i =;i<maxn;i++) Log[i] = Log[i/] + ;
}
void st(){
for(int i = ;i<=n;i++){
f[i][] = cnt[i];
}
for(int j = ;j<=Log[n+];j++){
for(int i = ;i+(<<j)-<=n;i++){
f[i][j] = max(f[i][j-],f[i+(<<(j-))][j-]);
}
}
}
int main(){
pre();
while(~scanf("%d",&n)){
if(n == ) break;
scanf("%d",&q);
for(int i = ;i<=n;i++){
scanf("%d",&a[i]);
if(i == ) cnt[i] = ;
if(a[i]!=a[i-]) cnt[i] = ;
else cnt[i] = cnt[i-] + ;
}
st();
for(int i = n;i>=;i--){
if(a[i] == a[i+]) index[i] = index[i+];
else index[i] = i;
}
while(q--){
int l,r;
int ans = ;
scanf("%d%d",&l,&r);
if(index[l] == index[r]){
ans = r - l + ;
}
else if(index[l] == index[l-]){//判断一下,如果在l左边的数和l位置的数相等,就说明被隔开了
int t = min(index[l],r)+;//算出后一部分区间的左端点
int ans1 = t - l ;//ans1单独计算 算出被隔开了多少数,这一部分单独计算
int s = Log[r-t+];//剩下部分用st表求
ans = max(ans1,max(f[t][s],f[r-(<<s)+][s]));//两者取最大值
}
else{
int s = Log[r-l+];
ans = max(f[l][s],f[r-(<<s)+][s]);
}
printf("%d\n",ans);
}
}
return ;
}
POJ 3368 (ST表)的更多相关文章
- POJ 3693 Maximum repetition substring(后缀数组+ST表)
[题目链接] poj.org/problem?id=3693 [题目大意] 求一个串重复次数最多的连续重复子串并输出,要求字典序最小. [题解] 考虑错位匹配,设重复部分长度为l,记s[i]和s[i+ ...
- POJ 3264 Balanced Lineup 【ST表 静态RMQ】
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total S ...
- Maximum repetition substring(POJ - 3693)(sa(后缀数组)+st表)
The repetition number of a string is defined as the maximum number \(R\) such that the string can be ...
- POJ 3264 Balanced Lineup | st表
题意: 求区间max-min st表模板 #include<cstdio> #include<algorithm> #include<cstring> #inclu ...
- POJ 3368 RMQ-ST
一直感觉RMQ水,没自己写过,今天写了一道题,算是完全独立写的,这感觉好久没有了... 一直以来,都是为了亚洲赛学算法,出现了几个问题: 1.学的其实只是怎么用算法,对算法的正确性没有好好理解,或者说 ...
- POJ1821 单调队列//ST表 优化dp
http://poj.org/problem?id=1821 当我们在考虑内层循环j以及决策k的时候,我们可以把外层变量i看作定值,以此来优化dp状态转移方程. 题意 有n个工人准备铺m个连续的墙,每 ...
- RMQ问题 - ST表的简单应用
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值 ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- st表树状数组入门题单
预备知识 st表(Sparse Table) 主要用来解决区间最值问题(RMQ)以及维护区间的各种性质(比如维护一段区间的最大公约数). 树状数组 单点更新 数组前缀和的查询 拓展:原数组是差分数组时 ...
随机推荐
- Markdown数学公式如何打出回归符号
来源:https://blog.csdn.net/garfielder007/article/details/51646604 函数.符号及特殊字符 语法 效果 语法 效果 语法 效果 \bar{x} ...
- 使用 VMware Workstation Pro 安装新的虚拟机
一.连接服务器 (1)“文件”右键 (2)输入用户名.密码连接服务器 二.创建新的虚拟机 (1) (2) (3) (4) (5) (6) (7) (8) 三.配置服务器 配置文档 - 链接:htt ...
- js日历三级联动
直接切入正题 <html><head><title>年月日三下拉框联动</title><meta http-equiv='Content-Type ...
- Jquery实现挂号平台首页源码
带二级导航.轮播海报.二级联动.搜索功能.Tab选项卡 按照国际惯例先放图 index.html <!DOCTYPE html> <html lang="zh-cn&quo ...
- Android 存档最优选项
1 开发环境:VS2019最新版本(16.4.5) 2 存档最优选项 说明:apk包70M(默认选项),apk包12M(调整后选项) 位置:Android 选项
- 0008 基于DRF框架开发(01 DRF开发的基本流程)
1 创建模型 由于之前在<004 工程配置>中,已在Applications/Organizations/models中创建了一个UserInfo模型.此处引用这个模型. from dja ...
- 牛客寒假训练营2-C算概率
思路 用 f(i,j) 来表示当前做了i道题,共做对了j道题 状态 f[i][j] = f[i-1][j] * (1-p[i]) + f[i-1][j-1] * p[i] 第一种:由于i-1时对了j题 ...
- 选课系统项目_python
一.功能简要 基本实现以下功能,但是有部分地方由于时间关系并未写,而且并未做细微的完善,大致功能完成.角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , pyt ...
- eXosip和osip详解
文档 可以查看exosip osip的在线文档 http://www.antisip.com/doc/ 在线文档 一般先看mainpage 会有库的一个整体说明. 其次看看 modules 会有一些使 ...
- unity ui中使用onmouseover
unity ui中鼠标移进或者移出的触发方式与2d.3d的不同,2d.3d物体使用的是onmouseover,ui使用的是OnPointerEnter.需要实现以下两个接口. public class ...