UVA11235 Frequent values

没看到多测调了半天

每组数据给定\(n,q\)。接下来给出一个长度为\(n\)的不降序列\(A\)。接下来\(q\)次询问,每次询问给定\(l,r\),求\(A_{l\sim r}\)中出现最多的那个数出现了多少次。

\(1\le n,q \le 10^5\)。


序列不降,意味着一个数在序列中一定是连续存在的。

那么我们可以把连续相同的元素分成一段(游程编码)。

设一共分了\(len\)段,第\(i\)段的左边界是\(l\),右边界是\(r\)。\(A_i\)在第\(num[i]\)段。

查询时,对于输入的\(x,y\)。我们的答案就是下面三种情况的最大值:

  • \(x\sim x\)所在组的右边界,即\(r[num[x]]-x+1\)。
  • \(y\)所在组的左边界\(\sim y\),即\(y-l[num[y]]+1\)。
  • \(x\)所在组的下一组\(\sim y\)所在组的上一组中,最大组的大小,即\(\max\limits_{num[x]<i<num[y]}(r[i]-l[i]+1)\)。这一操作可以用ST表来维护。

实现细节:

  • 如果\(num[x]=num[y]\)(\(x,y\)在同一组),则直接输出\(y-x+1\)。
  • 否则,答案就是上面\(3\)种情况的最大值,但需要注意调用query(num[x]+1,num[y]-1),可能会出现\(num[x]+1>num[y]-1\)的情况,此时\(query\)需要返回\(0\)。

每个测试点时间复杂度\(O(n\log n+q)\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,q,a[100010];
int siz,cur=INT_MIN;
int l[100010],r[100010],lg[100010];
int len,num[100010];
int maxx[100010][30];
void init(){
lg[0]=-1;
for(int i=1;i<=len;i++)
lg[i]=lg[i/2]+1,maxx[i][0]=r[i]-l[i]+1;
for(int i=1;i<=lg[len];i++){
for(int j=1;j+(1<<i)-1<=len;j++){
maxx[j][i]=max(maxx[j][i-1],maxx[j+(1<<(i-1))][i-1]);
}
}
}
int query(int l,int r){
if(l>r) return 0;
int t=lg[r-l+1];
return max(maxx[l][t],maxx[r-(1<<t)+1][t]);
}
int main(){
while(cin>>n>>q){
len=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(a[i]!=cur){
r[len]=i-1;
l[++len]=i;
cur=a[i];
}
num[i]=len;
}
r[len]=n;
init();
while(q--){
int x,y;
cin>>x>>y;
if(num[x]==num[y]) cout<<y-x+1<<endl;
else cout<<max(max(r[num[x]]-x+1,y-l[num[y]]+1),
query(num[x]+1,num[y]-1))<<endl;
}
}
return 0;
}

[题解]UVA11235 Frequent values的更多相关文章

  1. 【暑假】[实用数据结构]UVa11235 Frequent values

    UVa 11235 Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11241   Accep ...

  2. poj3368 uva11235 Frequent values

    Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...

  3. UVA-11235 Frequent values (RMQ)

    题目大意:在一个长度为n的不降序列中,有m次询问,每次询问(i,j)表示在区间(i,j)中找出出现次数最多的元素的出现次数. 题目分析:因为序列有序,可以将序列分段,并且记录每段的元素个数.每一个元素 ...

  4. UVA11235 Frequent values

    思路 连续的值只会分布在一起成一个块 讨论两边的块,中间就是RMQ了 ST表即可 代码 #include <cstdio> #include <algorithm> #incl ...

  5. [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  6. POJ 3368 Frequent values RMQ ST算法/线段树

                                                         Frequent values Time Limit: 2000MS   Memory Lim ...

  7. UVA - 11235 Frequent values

    2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...

  8. poj 3368 Frequent values(RMQ)

    /************************************************************ 题目: Frequent values(poj 3368) 链接: http ...

  9. H - Frequent values

    Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...

  10. Frequent values && Ping pong

    Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...

随机推荐

  1. 揭秘C#异步编程核心机制:从状态机到线程池的全面拆解

    C#中的异步编程是一个强大且复杂的特性,它允许开发者编写非阻塞的代码,从而显著提升应用程序的响应性和吞吐量.本文将深入剖析异步编程的底层原理,从async和await关键字的工作机制,到状态机.任务调 ...

  2. jupyter的使用 -- 快捷键

    jupyter的使用 1.快捷键的使用 插入cell:a,b 删除cell:x 执行cell:shift+enter 切换cell的模式:m,y cell执行后,在cell的左侧双击就可以回到cell ...

  3. fltk-1.4.2版本配置

    关于使用visual studio 2022配置FLTK-1.4.2版本编译项目链接报错解决方案 这里搬一下我自己在知乎写的回答. 目前发布最新稳定版本是FLTK-1.4.2版本,最近在折腾一些开源软 ...

  4. js节流函数与防抖函数

    防抖函数和节流函数都是为了解决JavaScript中频繁触发事件而导致的性能问题,但它们的实现方式和使用场景有所不同. 一.防抖函数 防抖函数的作用是在事件触发后一定时间内没有再次触发该事件时,才执行 ...

  5. Easing缓动函数宝藏网站

    鼠标放上去,就可以查看速度变化了 找了很久,终于找到了,大家可以收藏起来,很好用 https://easings.net/

  6. HyperWorks的模型简化

    2.2 模型简化 本节将介绍如何改变结构的外形以实现模型的简化.模型中对分析不需要的小特征,如小孔.导角等,将被去除.模型简化后将大大提高整体模型的网格质量.建模效率以及后续模型求解效率. 本节将学习 ...

  7. sublime text 2 snippet 设置

    1.标准文件写法 <snippet> <content><![CDATA[ 你需要插入的代码片段${1:name} ]]></content> < ...

  8. 故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理

    最近半个月遇到有两个客户的Oracle Exadata一体机出现物理磁盘的损坏,一个客户是机械磁盘.一个客户是FLASH磁盘.很巧的是这两个客户他们的日常运维过程中都是只看物理服务器的故障信号灯.但是 ...

  9. FastAPI安全加固:密钥轮换、限流策略与安全头部如何实现三重防护?

    扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 一.密钥轮换自动化机制 实现方案 ...

  10. 在 GoRoute 中使用 NavigationBar

    前言 在App 中通常会把主要的几个页面放在下方icon,让使用者能够方便操作,这个元件在flutter 中称为BottomNavigationBar. 而GoRouter则是Flutter 官方所提 ...