[RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数
注意多组数据!!!!
RMQ方法:
预处理 i 及其之前相同的数的个数
再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同的一段 (RMQ)
但是要注意 to[i] 大于查询范围的情况, 以及RMQ时 x < y 的情况!!
AC代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<vector> #include<queue> #include<stack> #include<map> #include<set> #include<string> #include<iomanip> #include<ctime> #include<climits> #include<cctype> #include<algorithm> #ifdef WIN32 #define AUTO "%I64d" #else #define AUTO "%lld" #endif using namespace std; const int INF=0x3f3f3f3f; const int maxn=100005; const int maxd=20; int n,q; int a[maxn]; int sum[maxn]; int to[maxn]; inline bool init() {if(!~scanf("%d%d",&n,&q) || !n) return false;for(int i=1;i<=n;i++) scanf("%d",a+i);sum[1]=1;for(int i=2;i<=n;i++)if(a[i-1]^a[i]) sum[i]=1;else sum[i]=sum[i-1]+1;to[n]=n;for(int i=n-1;i;i--)to[i] = a[i]^a[i+1]? i : to[i+1];return true; } int dp[maxn][maxd]; void ST() {for(int i=1;i<=n;i++) dp[i][0] = sum[i];int k=0;while( (1<<k+1) <= n ) k++;for(int j=1;j<=k;j++)for(int i=1;i+(1<<j)-1<=n;i++)dp[i][j] = max( dp[i][j-1] , dp[i+(1<<j-1)][j-1] ); // j-1 moved !!! } inline int RMQ(int x,int y) {if (x>y) return -INF; // INF here to make the case extinct!!int k=0;while( (1<<k+1) <= (y-x+1) ) k++;return max(dp[x][k] , dp[y-(1<<k)+1][k]); } int main() {freopen("fre.in","r",stdin);freopen("fre.out","w",stdout);while(init()){ST();for(int i=1;i<=q;i++){int x,y;scanf("%d%d",&x,&y);printf("%d\n",max(sum[min(to[x],y)]-sum[x]+1 , RMQ(to[x]+1,y)));}}return 0; }
View Code
线段树方法:
不急,懒得写了。。
转载于:https://www.cnblogs.com/ourfutr2330/p/5668354.html
[RMQ] [线段树] POJ 3368 Frequent Values相关推荐
- POJ 3368 Frequent values 【ST表RMQ 维护区间频率最大值】
传送门:http://poj.org/problem?id=3368 Frequent values Time Limit: 2000MS Memory Limit: 65536K Total S ...
- POJ 3368 Frequent values 线段树区间合并
题意O(-1)不用解释.. 线段树结点维护三个信息:区间内相同的数出现最多的次数maxc.区间左边第一个数出现的次数lc.区间右边第一个数出现的次数rc. 分左区间右端点和右区间左端点相同于否的情况合 ...
- POJ 3368 Frequent values (RMQ)
题目链接:http://poj.org/problem?id=3368 题目大意: 给出一个n个数长度的串. m个询问 求出给定范围内的最大连续字符串的长度 方法: RMQ模板, 记录每一个位置的数连 ...
- poj 3368 Frequent values rmq
题意:给你一串数列,然后给你一个起终位置对,问你这个段序列里出现最多的出现了几次. 思路:一段序列里,无非就是三种情况,1,一组相同的数,2两组相同,3,3组或者更多组数,这样我们队每一组数的开头结束 ...
- HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题解: 方法一:贪心. 在草稿纸上试多几次可以知道,删除数字中从左到右最后一位递增(可以等于)的 ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- 【CCCC】L3-017 森森快递 (30分),线段树rmq模板+贪心排序
problem L3-017 森森快递 (30分) 森森开了一家快递公司,叫森森快递.因为公司刚刚开张,所以业务路线很简单,可以认为是一条直线上的N个城市,这些城市从左到右依次从0到(N−1)编号.由 ...
- 线段树练习——区间合并
这类题目会询问区间中满足条件的连续最长区间,所以PushUp的时候需要对左右儿子的区间进行合并(这里最难理解) hdu 3308 http://acm.hdu.edu.cn/showproblem.p ...
- 【线段树】FREQUENT - Frequent values(luogu-SP1684 / poj 3368)
FREQUENT - Frequent values luogu-SP1684 poj 3368 题目大意: 有一个单调不降序列,让你求出某些区间内的出现次数最多的数出现的次数(有多组数据,以0结尾) ...
- poj 3264 Balanced Lineup RMQ问题 线段树
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...
最新文章
- vue总结 08状态管理vuex
- 150页在线书「几何深度学习」上线:利用对称性和不变性解决机器学习问题
- 斯坦福抢开“元宇宙”第一课,上起来还真不便宜
- 论numpy中matrix 和 array的区别
- H3C 交换机S5130S软件版本升级
- Psscor2 - 微软内部的SOS升级版(知道.net3.5)
- ios取两个数之间的随机小数_如果取到小数区间内的任一数字?
- 2019 序列号_抖音发布2019年度报告;苹果序列号;熊猫互娱进入破产程序
- dep指定版本 go_Go 包管理工具-dep
- 关于中国移动宽带(中国铁通)比较卡
- 魔百盒CM201-1,YS代工-免拆-线刷固件及教程
- pytorch如何freeze模型参数
- ML-czy的小组任务4
- 使用fsck修复文件系统
- informatica session中bulk和normal模式
- 【微信小程序】开发入门篇(二)
- 关于Java面试,你应该准备这些知识点
- SAR成像处理算法_CS算法_程序设计(Matlab)
- 基于php+Mysql网上商城系统 开题报告
- Android 调整进程的最大fd 数目
热门文章
- 1、最小二乘回归、Lasso、岭回归
- linux下rpm包安装jdk,linux jdk rpm包安装
- jupyterlab中使用conda虚拟环境
- type(img).__module__ == np.__name__
- pytorch导入模型
- Network In Network论文笔记
- Python实现蒙特卡罗方法仿真模拟求解圆周率Pi值
- python连接SQLServer数据库创建数据表同时为每个字段加上对应的中文注释信息
- 鸿蒙2.0内测版手机版,不再遮遮掩掩,鸿蒙2.0测试版下月发布,用于手机内测
- 【Django 2021年最新版教程5】前端传递数据到后端处理 GET 方法