[题解]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的更多相关文章
- 【暑假】[实用数据结构]UVa11235 Frequent values
UVa 11235 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11241 Accep ...
- poj3368 uva11235 Frequent values
Description You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In ad ...
- UVA-11235 Frequent values (RMQ)
题目大意:在一个长度为n的不降序列中,有m次询问,每次询问(i,j)表示在区间(i,j)中找出出现次数最多的元素的出现次数. 题目分析:因为序列有序,可以将序列分段,并且记录每段的元素个数.每一个元素 ...
- UVA11235 Frequent values
思路 连续的值只会分布在一起成一个块 讨论两边的块,中间就是RMQ了 ST表即可 代码 #include <cstdio> #include <algorithm> #incl ...
- [POJ] 3368 / [UVA] 11235 - Frequent values [ST算法]
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- POJ 3368 Frequent values RMQ ST算法/线段树
Frequent values Time Limit: 2000MS Memory Lim ...
- UVA - 11235 Frequent values
2007/2008 ACM International Collegiate Programming Contest University of Ulm Local Contest Problem F ...
- poj 3368 Frequent values(RMQ)
/************************************************************ 题目: Frequent values(poj 3368) 链接: http ...
- H - Frequent values
Problem F: Frequent values You are given a sequence of n integers a1 , a2 , ... , an in non-decreasi ...
- Frequent values && Ping pong
Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...
随机推荐
- 洛谷 P3792 由乃与大母神原型和偶像崇拜
洛谷 P3792 由乃与大母神原型和偶像崇拜 Problem 糖果屋的故事讲的就是韩赛尔和格雷特被继母赶出家里,因为没饭吃了,然后进了森林发现了一个糖果屋,里面有个女巫,专门吃小孩子 然而如果我们仔细 ...
- 题解:P1763 埃及分数
题目链接:link. 先放上代码,然后再讲解: #include<bits/stdc++.h> using namespace std; typedef long long ll; ll ...
- gitlab runner operator部署配置
背景说明 由于公司管理的git runner资源不足,导致并发的任务比较多时,出现大面积的排队,比较影响效率.基于此问题,我们可以自建一部分Runner给到相应的仓库使用.这里我们有自建的 在k8s集 ...
- Golang解析yaml文件
一.具体思路 将配置yaml文件内容解析为我们定义好的struct,这种比较简单,如果想获取对应的值,直接获取即可. 二.实现步骤 首先根据配置文件的内容定义一个结构体Config,结构体类型和yam ...
- 防抖ref如何在vue中被定义
本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这 ...
- SpringBoot中mybatis的相关配置
mybatis配置 mybatis: # 别名,在mybatis的mapper中可以直接使用同名来代替包名 type-aliases-package: com.mao.springcloud.pojo ...
- AI大模型应用开发入门-LangChain实现RAG检索增强生成
检索增强生成(RAG)是一种结合"向量检索"与"大语言模型"的技术路线,能在问答.摘要.文档分析等场景中大幅提升准确性与上下文利用率. 本文将基于 LangCh ...
- 微信小程序之WXML特性和WXSS特性
WXML特性之数据绑定 数据绑定 数据绑定属性 运算符绑定 通用属性 WXML特性之列表渲染 block不是组件,只是一个包装元素,不会在界面渲染出来. WXML特性之条件渲染 wx:if : 渲染时 ...
- 【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package
问题描述 部署Java应用到Azure Container App中,首先需要在本地构建镜像文件后上传到Azure Contaienr Registrier中. 但是,在第一步构建镜像的时候,就遇见错 ...
- iga 入门之 总体合成
简介 摘自 流体力学数值方法 概括地说,总体合成就是将所有单元的\(A_{ij}^{(e)}.f_i^{(e)}\)进行累加,最终形成\(A_{nm}.f_n\),从而产生总体有限元方程 \[A_{n ...