[COJ0985]WZJ的数据结构(负十五)
[COJ0985]WZJ的数据结构(负十五)
试题描述
CHX有一个问题想问问大家。给你一个长度为N的数列A,请你找到两个位置L,R,使得A[L]、A[L+1]、……、A[R]中没有重复的数,输出R-L+1的最大值。
以上是附中联赛加试的一道题。WZJ觉得这道题太水了,改了改题目:
WZJ有一个问题想问问大家。给你一个长度为N的数列A,你要回答M次问题。每次问题给你两个正整数ql,qr。请你找到两个位置L、R (ql<=L<=R<=qr),使得A[L]、A[L+1]、……、A[R]中没有重复的数,输出R-L+1的最大值。
介于某些人的吐槽,本题不强制在线。注意范围,祝你好运!
输入
输入第一行为两个正整数N,M。
输入第二行为N个整数Ai。
接下来M行每行两个正整数ql,qr。
输出
对于每个问题,输出R-L+1的最大值。
输入示例
输出示例
数据规模及约定
1<=N<=200000
1<=M<=500000
1<=ql,qr<=N
-10^9<=Ai<=10^9
题解
找出所有数上一次出现在哪(即对于一个数 A[i],找到一个最大的 pos 使得 A[pos] = A[i] 且 pos < i),然后计算出 f[i] 表示区间 [f[i], i] 没有重复元素,且使得 f[i] 尽量小。那么我们对于每个位置记录 i - f[i] + 1,即最长区间长度,那么对于询问 [ql, qr],找到 [ql, k] 没有重复元素且 k ≤ qr 的这个 k,然后 k 右边部分求一个最大值,左边直接减。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std; const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
if(Head == Tail) {
int l = fread(buffer, 1, BufferSize, stdin);
Tail = (Head = buffer) + l;
}
return *Head++;
}
int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 200010
#define maxlog 20
int n, q, A[maxn], num[maxn], lp[maxn], f[maxn]; int Log[maxn], mx[maxlog][maxn];
void init() {
Log[1] = 0;
for(int i = 2; i <= n; i++) Log[i] = Log[i>>1] + 1;
for(int i = 1; i <= n; i++) mx[0][i] = i - f[i] + 1;
for(int j = 1; j < maxlog; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++)
mx[j][i] = max(mx[j-1][i], mx[j-1][i+(1<<j-1)]);
return ;
}
int query(int l, int r) {
if(l > r) return -1;
int len = r - l + 1, t = Log[len];
return max(mx[t][l], mx[t][r-(1<<t)+1]);
} int main() {
n = read(); q = read();
for(int i = 1; i <= n; i++) num[i] = A[i] = read(); sort(num + 1, num + n + 1);
for(int i = 1; i <= n; i++) {
A[i] = lower_bound(num + 1, num + n + 1, A[i]) - num;
f[i] = max(f[i-1], lp[A[i]] + 1);
lp[A[i]] = i;
}
init(); while(q--) {
int ql = read(), qr = read();
int k = upper_bound(f + 1, f + n + 1, ql) - f - 1;
k = min(k, qr);
printf("%d\n", max(k - ql + 1, query(k+1, qr)));
} return 0;
}
[COJ0985]WZJ的数据结构(负十五)的更多相关文章
- COJ 1010 WZJ的数据结构(十) 线段树区间操作
传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=1001 WZJ的数据结构(十) 难度级别:D: 运行时间限制:3000ms: ...
- COJ 0985 WZJ的数据结构(负十五)(限定区域不同数)
传送门:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=955 试题描述: CHX有一个问题想问问大家.给你一个长度为N的数列 ...
- Python - 数据结构 - 第十五天
Python 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构. 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和 ...
- COJ1012 WZJ的数据结构(十二)
今天突然想写个树套树爽一爽(1810ms) 写的是树状数组套线段树(动态开节点) #include<cstdio> #include<cctype> #include<c ...
- Java数据结构(十五)—— 多路查找树
多路查找树 二叉树和B树 二叉树的问题分析 二叉树操作效率高 二叉树需要加载到内存,若二叉树的节点多存在如下问题: 问题1:构建二叉树时,需多次进行I/O操作,对与速度有影响 问题2:节点海量造成二叉 ...
- [COJ0988]WZJ的数据结构(负十二)
[COJ0988]WZJ的数据结构(负十二) 试题描述 输入 见题目,注意本题不能用文件输入输出 输出 见题目,注意本题不能用文件输入输出 输入示例 输出示例 数据规模及约定 1≤N≤1500,M≤N ...
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- COJ970 WZJ的数据结构(负三十)
WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计 ...
- COJ968 WZJ的数据结构(负三十二)
WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...
随机推荐
- bootstrap弹框
http://v3.bootcss.com/javascript/#modals 参考bootstrap官网 模态框做php后端 前端一直不行,但是很多时候 用到ajax都要用到弹框,一直在代码里面找 ...
- CV界的明星人物们
CV界的明星人物们 来自:http://blog.csdn.net/necrazy/article/details/9380151,另外根据自己关注的地方,加了点东西. 今天在cvchina论坛上看到 ...
- JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray
JSONModel 嵌套字典数组 JSONModel nest NSDictionary NSArray
- osharp3 操作日志之数据日志 控制增强
osharp3 原来的数据日志,有配置文件中有这总开关,DataLoggingEnabled,原来的程序是,这个总开关关了,就无法记录数据日志了,,如果开了,,他不管记录不记录数据日志,系统都会存数据 ...
- PHP任意文件包含绕过截断新姿势
前言 此方法是@l3m0n叔叔给我分享的,原文已经发布在90sec 我没有90sec的账号,所以自己实践一下,顺道安利给访问我博客的小伙伴. 适用情况 可以控制协议的情况下,如果%00无法截断包含,可 ...
- apache 的工作模式
总结:访问量大的时候使用 worker模式: 每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...
- 【转】linux ar 命令的使用说明那个和例子
from: http://blog.csdn.net/xljiulong/article/details/7082960 linux ar 命令的使用说明那个和例子 标签: linuxmakefile ...
- 如何使用jquery - ui 的图标icons 及图标的相对位置 +jquerui是如何来显示图标的?
1. 只需要引入 jquery-ui 的主css文件: jquery-ui.css 文件?? 不需要 引入 jquery-ui-structure/theme.css文件??? ,,,,, 2. 一定 ...
- Linux启动管理:grub
1.grub中分区表示 Linux 中 /dev/sda1 在grub中为 hd0,0 代表第一个硬盘的第一个分区 Linux中 /dev/sdb3是扩展分区 在grub中为 ...
- 给select添加自定义值和选项
添加选项: document.getElementById("id_select").options.add(new Option("name", " ...