题目大意:一个非降序序列,有若干查询,每次查询一个区间中重复次数最多的数字的个数。

思路:因为是非降序的,所以可以从头遍历把每个相同的数字划为一个块,用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题解的更多相关文章

  1. POJ - 题解sol[暂停更新]

    初期:一.基本算法: (1)枚举. (poj1753,poj2965) poj1753 话说我用高斯消元过了这题... poj2965 巧了,用高斯消元01矩阵更快(l o l). (2)贪心(poj ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. gin中的SecureJSON 防止 json 劫持

    使用 SecureJSON 防止 json 劫持.如果给定的结构是数组值或map,则默认预置 "while(1)," 到响应体. package main import ( &qu ...

  2. Go 转义字符及风格

    今天来学习一下Go 中的转义字符,源码注释,规范的代码风格以及标准库API 文档; Go 转义字符常用的转义字符有以下几个:1. \t: 表示一个制表符(tab), 通常可以使用它进行排版; 2. \ ...

  3. Nginx配置文件nginx.conf有哪些属性模块?

    worker_processes 1: # worker进程的数量 events { # 事件区块开始 worker_connections 1024: # 每个worker进程支持的最大连接数 } ...

  4. find直接copy大于某一个时间小于某一个时间的文件

    find ./ -type f -newermt '2000-01-04 10:30:00' ! -newermt '2019-10-28 10:57:00' -exec cp -a {} /var/ ...

  5. 多线程中sleep方法,简单介绍。

    一 是什么? package com.aaa.threaddemo; /* * 多线程中的sleep方法? * sleep 隶属于Thread的方法,顾名思义,让线程睡一会. 1 public sta ...

  6. C编译器中“不是所有的控件路径都返回值”报错

    编译器的判断逻辑是是否在所有的分支中都返回了值,即if不成立时也必须返回值.编译器认为如果三个if都不成立则此函数可能没有返回值,故报错.需要将第三个if改为else或者去掉if体直接return.

  7. C语言之清空缓存区

    感谢大佬:https://blog.csdn.net/qq_26768741/article/details/50933598 在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们 ...

  8. 微信小程序音频播放 InnerAudioContext 的用法

    今天项目上涉及到了微信小程序播放音频功能,所以今天跟着一些教程做了个简单的播放器 1.实现思路 刚开始想着有没有现成的组件可以直接用,找到了微信的媒体组件 audio,奈何看着 1.6.0版本开始,该 ...

  9. 基于人工智能标记语言 (AIML)和任务型对话系统(Task)的深度智能对话机器人demo

    起因 本demo基于基于人工智能标记语言 (AIML)和开放域问答(WebQA)的深度智能对话模型而来 无意间发现一个基于人工智能标记语言 (AIML)和开放域问答(WebQA)的深度智能对话模型,但 ...

  10. 配置samba共享,实现/www目录共享

    一.samba服务器 1.安装samba包 # yum -y install samba 2.创建用户组 # groupadd -r admins # useradd -s /sbin/nologin ...