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或 ...
随机推荐
- ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析
CyclicBarrier和CountDownLatch CyclicBarrier和CountDownLatch 都位于java.util.concurrent这个包下,其工作原理的核心要点: Cy ...
- java IO 文件复制代码模型
package com.xjtu.demo; import java.io.*; public class FileCopy { public static void main(String[] ar ...
- migrate 和makemigrations 命令
在你改动了app下 models.py的内容之后执行下面的命令: Python manger.py makemigrations 相当于 在该app下建立 migrations目录,并记录下你所有的关 ...
- DBeaver下载安装与连接MySQL数据库
一.Dbeaver下载 官网下载地址:Download | DBeaver Community 点击"Windows 64 bit (installer)"即可进行下载. 二.Db ...
- linux单用户模式修改密码与系统启动级别
目录 一:系统启动级别 二:单用户模式修改密码 一:系统启动级别 系统启动级别: 0 关机 1 单用户模式(无法通过xshell方式使用)(虚拟机操作)(系统云服务商后台) 2 多用户无网络模式 3 ...
- C++ 微信多开
应用是如何判断多开 一.通过查找窗口标题或者类名来判断程序是否正在运行. 二.通过互斥对象确定程序是否运行,大多数软件都是使用CreateMutexW 判断多开的. 三.内存映射物理文件,控制多开. ...
- JVM专题2: JVM内存结构
合集目录 JVM专题2: JVM内存结构 Java 内存分配 JVM 内存结构 The JVM is an abstract computing machine that enables a comp ...
- TypeScript入门文档
typescript入门文档链接d地址:https://ts.xcatliu.com/basics/type-of-function.html 博主个人站点:www.devloper.top
- 第09讲:Flink 状态与容错
Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 第04讲:Flin ...
- AI 智能写情诗、藏头诗
一.AI 智能情诗.藏头诗展示 最近使用PyTorch的LSTM训练一个写情诗(七言)的模型,可以随机生成情诗.也可以生成藏头情诗. 在特殊的日子用AI生成一首这样的诗,是不是很酷!下面分享下AI 智 ...