Rmq Problem
大视野——3339: Rmq Problem
Time Limit: 20 Sec Memory Limit: 128 MB
Submit: 1192 Solved: 620
[Submit][Status][Discuss]
Description

Input

Output

Sample Input
0 2 1 0 1 3 2
1 3
2 3
1 4
3 6
2 7
Sample Output
0
3
2
4
HINT

Source
思路:
对于这个题似乎暴力不好打,而且似乎强制在线操作也比较难弄。但是,强制在线操作不好弄,我们来试试离线操作。由于这个题支持离线操作,so,我们来考虑一下离线操作怎么弄。
首先,我们可以这样想,不是要输入一串数嘛,你在输入这些数时进行一个预处理。先预处理出每个数添加进去时从这堆数的开头开始一直到这个是添加进去时,这堆数的mex值。
在预处理这堆数的mex值时,我们可以这样想,对于一个数我们把它加进去,对这堆数的mex值产生什么影响呢?
你可以这样想,如果把这个数填进去使这堆数的mex值变得更小的话,那样的话这个mex在开始的时候就已经使用过的了,这样的话,是不是就说明再添加进一个数的时候,对他的max数产生的影响就是这个数的max数只有可能变大。
在就是在处理的时候,我们要这样来看,对于一堆区间我们要求他的max值,我们该怎样来做呢?
我们先把要求的区间排个序,当然要先存下这堆数的编号,方便以后输出。
我们按照每一个区间左端点排序,每一次都将这整个区间的左端点进行向内缩,直到缩到这个要求的区间为止。
向内进行所点的时候,每索一个,这个点存在两种情况,一.这个点在后面还会再出现那样的话,将这个点去掉以后是不是对以后的区间的max值没有影响啊。 二.这个点在以后没有存在,那下个区间的max值的影响为,若这个点的值比下个区间的max值大那他的max值不发生改变,若这个点的值比下一个区间的max小,那就将下一个区间的max值赋成这个点的值。
对于区间修改的时候,我们可以采用线段树。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#define inf 0x7fffffff
using namespace std;
inline int read()
{
;char ch=getchar();
'){ch=getchar();}
+ch-';ch=getchar();}
return x;
}
;
],sg[],ans[],next[],last[];
],rs[],mn[];
];
];
bool cmp(data a,data b)
{return a.l<b.l;}
void build(int k,int l,int r)
{
ls[k]=l;rs[k]=r;mn[k]=inf;
if(l==r){mn[k]=sg[l];return;}
;
build(k<<,l,mid);build(k<<|,mid+,r);
}
void pushdown(int k)
{
int l=ls[k],r=rs[k];
if(l==r)return;
mn[k<<]=min(mn[k],mn[k<<]);
mn[k<<|]=min(mn[k],mn[k<<|]);
}
int ask(int k,int x)
{
if(mn[k]!=inf)pushdown(k);
int l=ls[k],r=rs[k];
if(l==r)return mn[k];
;
,x);
|,x);
}
void update(int k,int x,int y,int val)
{
if(mn[k]!=inf)pushdown(k);
int l=ls[k],r=rs[k];
if(l==x&&y==r){mn[k]=min(mn[k],val);return;}
;
,x,y,val);
|,x,y,val);
,x,mid,val);update(k<<|,mid+,y,val);}
}
int main()
{
n=read();m=read();
;i<=n;i++)
a[i]=read();
;i<=n;i++)
{
mark[a[i]]=;
if(a[i]==k)
while(mark[k])k++;
sg[i]=k;
}
build(,,n);
;i--)
next[i]=last[a[i]],last[a[i]]=i;
;i<=m;i++)
{
q[i].l=read();q[i].r=read();
q[i].id=i;
}
sort(q+,q+m+,cmp);
;
;i<=m;i++)
{
while(now<q[i].l)
{
;
update(,now,next[now]-,a[now]);
now++;
}
ans[q[i].id]=ask(,q[i].r);
}
;i<=m;i++)
printf("%d\n",ans[i]);
;
}
Rmq Problem的更多相关文章
- BZOJ 3489: A simple rmq problem
3489: A simple rmq problem Time Limit: 40 Sec Memory Limit: 600 MBSubmit: 1594 Solved: 520[Submit] ...
- BZOJ3339 Rmq Problem
[bzoj3339]Rmq Problem Description Input Output Sample Input 7 5 0 2 1 0 1 3 2 1 3 2 3 1 4 3 6 2 7 Sa ...
- bzoj 3489: A simple rmq problem k-d树思想大暴力
3489: A simple rmq problem Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 551 Solved: 170[Submit][ ...
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- 【Luogu4137】Rmq Problem/mex (莫队)
[Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...
- P4137 Rmq Problem / mex (莫队)
题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...
- Codeforces 803G Periodic RMQ Problem 线段树
Periodic RMQ Problem 动态开点线段树直接搞, 我把它分成两部分, 一部分是原来树上的, 一部分是后来染上去的,两个部分取最小值. 感觉有点难写.. #include<bits ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- 洛谷 P4137 Rmq Problem /mex 解题报告
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...
- 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex
题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...
随机推荐
- react native在xcode真机调试ios
1修改URL地址:打开项目目录下的AppDelegate.m文件,修改里面的URL,把localhost改为你的电脑的IP.在Mac系统下,你可以在系统设置/网络里找到电脑的IP地址. 2选择设备:把 ...
- Spring根据XML配置文件 p名称空间注入属性(property后出现,简便但只针对基本数据类型管用,自定义集合等引用类型无效)
要生成对象并通过名称空间注入属性的类 代码如下: package com.swift; public class User { private String userName; public void ...
- Xcode 6 创建 Objective-C category
1. Command + N 2. 选择 iOS - Source - Objective-C File 3.File Type 选择 Category,Class 填基于的类名,File填扩展的名
- C# 使用Epplus导出Excel [3]:合并列连续相同数据
C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...
- 调用 C 动态库
调用 C 动态库 由 王巍 (@ONEVCAT) 发布于 2015/11/04 C 是程序世界的宝库,在我们面向的设备系统中,也内置了大量的 C 动态库帮助我们完成各种任务.比如涉及到压缩的话我们很可 ...
- 洛谷P1001 A+B Problem
这道题…………还是很简单!!! code: #include <iostream> #include <cstdio> using namespace std; int mai ...
- 简单的Redis数据迁移
dump迁移 1.安装redis-dump工具 sudo apt-get install ruby rubygems ruby-devel -y gem sources --add http://ge ...
- Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上 ...
- Java实现——Dom4j读写XML文件
1. dom4j概述 解析DOM4J是一个开源XML解析包,采用了Java集合框架并完全支持DOM,SAX和JAXP. 最大的特色是使用了大量的接口,主要接口都在org.dom4j里定义. 2. do ...
- 【LeetCode】Intersection of Two Linked Lists(相交链表)
这道题是LeetCode里的第160道题. 题目讲的: 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, ...