离线, 询问排序.

先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了

--------------------------------------------------------------------

#include<bits/stdc++.h>
 
using namespace std;
 
#define M(l, r) (((l) + (r)) >> 1)
 
const int maxn = 200009;
 
int id[maxn], N = 0, seq[maxn], n, T[maxn];
bool F[maxn];
 
struct link {
int pos;
link* next;
} A[maxn], *head[maxn], *pit = A;
 
struct Q {
int l, r, p;
inline void read(int _p) {
scanf("%d%d", &l, &r); l--; r--;
p = _p;
}
bool operator < (const Q &q) const {
return l < q.l;
}
} B[maxn];
 
struct Node {
Node *l, *r;
int tag;
Node() {
tag = -1;
l = r = NULL;
}
inline void pushdown() {
if(~tag) {
l->tag = ~l->tag ? min(l->tag, tag) : tag;
r->tag = ~r->tag ? min(r->tag, tag) : tag;
tag = -1;
}
}
} pool[maxn << 1], *pt = pool, *root;
 
void build(Node* t, int l, int r) {
if(r > l) {
int m = M(l, r);
build(t->l = pt++, l, m);
build(t->r = pt++, m + 1, r);
} else
   t->tag = T[l - 1];
}
 
int L, R, v;
 
void modify(Node* t, int l, int r) {
if(L <= l && r <= R)
   t->tag = ~t->tag ? min(t->tag, v) : v;
else {
t->pushdown();
int m = M(l, r);
if(L <= m) modify(t->l, l, m);
if(m < R) modify(t->r, m + 1, r);
}
}
int query(Node* t, int l, int r) {
if(l == r)
   return t->tag;
t->pushdown();
int m = M(l, r);
return L <= m ? query(t->l, l, m) : query(t->r, m + 1, r);
}
 
int ans[maxn];
 
int main() {
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
memset(head, 0, sizeof head);
memset(F, false, sizeof F);
int m;
cin >> n >> m;
for(int i = 0; i < n; i++) {
scanf("%d", seq + i);
id[i] = seq[i];
}
sort(id, id + n);
N = unique(id, id + n) - id;
for(int i = 0; i < n; i++)
   seq[i] = lower_bound(id, id + N, seq[i]) - id;
for(int i = n - 1; ~i; i--) {
int t = seq[i];
pit->pos = i;
pit->next = head[t];
head[t] = pit++;
}
for(int i = 0; i < n; i++) {
if(id[seq[i]] < maxn) F[id[seq[i]]] = true;
T[i] = i ? T[i - 1] : 0;
while(F[T[i]]) T[i]++;
}
build(root = pt++, 1, n);
for(int i = 0; i < m; i++)
   B[i].read(i);
sort(B, B + m);
int p = 0;
for(int i = 0; i < n; i++) {
while(p < m && B[p].l == i) {
L = B[p].r + 1;
ans[B[p].p] = query(root, 1, n);
p++;
}
if(i == n - 1 || p >= m) break;
head[seq[i]] = head[seq[i]]->next;
L = i + 1; R = head[seq[i]] ? head[seq[i]]->pos : n; v = id[seq[i]];
modify(root, 1, n);
}
for(int i = 0; i < m; i++)
   printf("%d\n", ans[i]);
return 0;
}

--------------------------------------------------------------------

3585: mex

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 454  Solved: 232
[Submit][Status][Discuss]

Description

  有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

Input

  第一行n,m。
  第二行为n个数。
  从第三行开始,每行一个询问l,r。

Output

  一行一个数,表示每个询问的答案。

Sample Input

5 5
2 1 0 2 1
3 3
2 3
2 4
1 2
3 5

Sample Output

1
2
3
0
3

HINT

数据规模和约定

  对于100%的数据:

  1<=n,m<=200000

  0<=ai<=109

  1<=l<=r<=n

  对于30%的数据:

  1<=n,m<=1000

Source

BZOJ 3585: mex( 离线 + 线段树 )的更多相关文章

  1. 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3585 好神的题. 但是!!!!!!!!!!!!!!我线段树现在要开8倍空间才能过!!!!!!!!!! ...

  2. HUAS 1483 mex(离线+线段树)

    实在是太弱了.... 考虑离线,从mex[l,r]向mex[l,r+1]转移,显然是没啥东西可以记录的... 从mex[l,r]向mex[l+1,r]转移,记x=mex[l,r],如果[l+1,r]不 ...

  3. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  4. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  5. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  7. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  8. Bzoj 2752 高速公路 (期望,线段树)

    Bzoj 2752 高速公路 (期望,线段树) 题目链接 这道题显然求边,因为题目是一条链,所以直接采用把边编上号.看成序列即可 \(1\)与\(2\)号点的边连得是. 编号为\(1\)的点.查询的时 ...

  9. bzoj 3585 mex - 线段树 - 分块 - 莫队算法

    Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...

随机推荐

  1. Failed to fetch URL http://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: Connectio (andriod sdk manager) http://dl-ssl.google.com/android上不去解决方案

    Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml  Fetched Add-ons List succes ...

  2. perl学习(3) 列表

      列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法. 1.1.定义 一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是 ...

  3. JavaEE Tutorials (6) - 使用嵌入式企业bean容器

    6.1嵌入式企业bean容器概述826.2开发嵌入式企业bean应用82 6.2.1运行嵌入式应用83 6.2.2创建企业bean容器83 6.2.3查找会话bean引用84 6.2.4关闭企业bea ...

  4. android Graphics(三):区域(Range)

    前言:最近几天对画图的研究有些缓慢,项目开始写代码了,只能在晚上空闲的时候捯饬一下自己的东西,今天给大家讲讲区域的相关知识,已经想好后面两篇的内容了,这几天有时间赶紧写出来给大家.有关界面开发的东东内 ...

  5. [Swust OJ 137]--波浪数(hash+波浪数构造)

    题目链接:http://acm.swust.edu.cn/problem/137/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  6. CGroup 介绍、应用实例及原理描述

    CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu ...

  7. SMTP邮件传输协议发送邮件和附件(转)

    1.     SMTP 常用命令简介 1). SMTP 常用命令 HELO/EHLO 向服务器标识用户身份 MAIL 初始化邮件传输 mail from: RCPT 标识单个的邮件接收人:常在MAIL ...

  8. net core开发环境准备

    net core开发环境准备 1.1  安装sdk和运行时 浏览器打开网址https://www.microsoft.com/net/download, 到.Net Core下载页面. 根据操作系统, ...

  9. SolrCloud简介

    原文地址:http://www.chepoo.com/solrcloud-introduction.html 一.简介 SolrCloud是Solr4.0版本以后基于Solr和Zookeeper的分布 ...

  10. 设计模式(九)外观模式Facade(结构型)

    设计模式(九)外观模式Facade(结构型) 1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. ...