POJ3368题解
题目大意:一个非降序序列,有若干查询,每次查询一个区间中重复次数最多的数字的个数。
思路:因为是非降序的,所以可以从头遍历把每个相同的数字划为一个块,用p[i]表示ai划分到了哪个块里面,同时还可以记录每个块的左右边界。同时还可以获得每块中数字的个数。可以把这些个数处理成ST表。
对于每个给定的查询区间,如果区间完全包含于某一个块内,那么说明区间内所有数字相同,答案就是区间的长度。否则,该查询区间可以分为3个部分:1)左侧[l,r[p[l]]的一个块的部分,2)左右侧[l[p[r],r]的另一个块的部分,以及3)中间的若干完整的块。其中1),2)中重复数字的数量分别就是他们的区间长度,而3)的部分可以通过ST表用RMQ求得,答案就是这三者取最大值。
代码:
//POJ.3368
//Author: Prgl
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
//ST表,各段数字出现次数,第i个数字位于第几段,段的左右界(左闭右开)
int b[100010][30], freq[100010], p[100010], l[100010], r[100010];
void RMQ_init(int n)
{
for (int i = 0; i < n; i++)
b[i][0] = freq[i];
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 0; i + (1 << j) - 1 < n; i++)
b[i][j] = max(b[i][j - 1], b[i + (1 << (j - 1))][j - 1]);
}
}
int RMQ(int l, int r)
{
int k = 0;
if (l >= r)
return 0;
while (1 << (k + 1) < r - l)
k++;
return max(b[l][k], b[r - (1 << k)][k]);
}
int N, Q;
void solve()
{
memset(freq, 0, sizeof(freq));
int num, last;
int index = 0;
for (int i = 0; i < N; i++)
{
cin >> num;
if (i == 0)
{
last = num;
freq[index]++;
l[0] = 0;
}
else
{
if (num == last)
{
freq[index]++;
}
else
{
last = num;
r[index++] = i;
freq[index]++;
l[index] = i;
}
}
p[i] = index;
}
r[index] = N;
RMQ_init(index + 1);
int ql, qr, ans, lo, hi;
for (int i = 0; i < Q; i++)
{
scanf("%d%d", &lo, &hi);
ql = lo - 1;
qr = hi - 1;
if (p[ql] == p[qr])
ans = qr - ql + 1;
else
{
int a = r[p[ql]] - ql;
int b = qr - l[p[qr]] + 1;
int c = RMQ(p[ql] + 1, p[qr]);
ans = max(a, max(b, c));
}
printf("%d\n", ans);
}
}
int main()
{
scanf("%d", &N);
while (N != 0)
{
scanf("%d", &Q);
solve();
scanf("%d", &N);
}
return 0;
}
POJ3368题解的更多相关文章
- POJ - 题解sol[暂停更新]
初期:一.基本算法: (1)枚举. (poj1753,poj2965) poj1753 话说我用高斯消元过了这题... poj2965 巧了,用高斯消元01矩阵更快(l o l). (2)贪心(poj ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- DNS主从同步部署
DNS 主从同步原理 主从同步:主每次修改配置文件需要修改一下序列号,主从同步主要 根据序列号的变化. 从DNS:从可以单独修改,主从不会报错.但从修改后,主端同步给从后 从端修改数据会丢失 主从原理 ...
- Java中四种访问权限总结
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
- Go语言切片一网打尽,别和Java语法傻傻分不清楚
前言 我总想着搞清楚,什么样的技术文章才算是好的文章呢?因为写一篇今后自己还愿意阅读的文章并不容易,暂时只能以此为目标努力. 最近开始用Go刷一些题,遇到了一些切片相关的细节问题,这里做一些总结.切片 ...
- numpy常用函数记录
np.square() 函数返回一个新数组,该数组的元素值为源数组元素的平方. 源阵列保持不变. 示例: import numpy as np a = np.array([[1, 2, 3], [4, ...
- 关于mysql,需要掌握的基础(二):JDBC和DAO层
目录 关于mysql,需要掌握的基础(二):JDBC和DAO层 1.了解jdbc是什么? 2.加载注册驱动:为什么Class.forName("com.mysql.jdbc.Driver ...
- 使用Hot Chocolate和.NET 6构建GraphQL应用(5) —— 实现Query过滤功能
系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 对于查询来说,还有一大需求是针对查询的数据进行过滤,本篇文章我们准备实现GraphQL中基本的查询过滤. 思 ...
- PHP获取日期和时间:
转载请注明来源:https://www.cnblogs.com/hookjc/ 使用函式 date() 实现 <?php echo $showtime=date("Y-m-d H:i: ...
- kebernet--新手填坑
1.安装好kubernet之后,新建rc后,里面的容器一直ImagePullBackOff ,镜像无法拉取: ----需要配置docker镜像为国内镜像,记得在各个Node上都要配置!!! vim / ...
- nvidia-smi
内容转自:https://blog.csdn.net/handsome_bear/article/details/80903477 nvidia-smi 显示 说明 Fan 风扇转速(0%--100% ...
- pyrealsense2学习
如何得到realsense设备信息 前提:将D455连接在电脑上,并且已经下载好 Realsense Viewer 打开Realsense Viewer--> Info, 便可得到相机的一些参数 ...