离线, 询问排序.

先处理出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. LNMP下基于端口的虚拟主机配置

    1.在/usr/local/nginx/conf/nginx.conf文件的的最后一个"}"前加上 include vhost/*.conf; 2.在/usr/local/ngin ...

  2. Basic REST API Design

  3. LinuxC安装gcc

    使用centos进行C编程的时候使用gcc hello.c提示 bash:gcc:command not found 此时需要给Linux安装gcc命令如下 1 yum -y install gcc ...

  4. linq中的临时变量

    有一个字符串数组: string[]arrStr={"123","234","345","456"}; 现在想得到该数组 ...

  5. 在vmware里面免费安装纯净的xp虚拟机

    1. 安装vmware, 略 2. 下载xp http://msdn.itellyou.cn/ 用迅雷下载Windows XP Professional with Service Pack 3 (x8 ...

  6. grub2的/etc/default/grub文件详解

    # If you change this file, run 'update-grub' afterwards to update# /boot/grub/grub.cfg.GRUB_DEFAULT= ...

  7. 在VS上配置OpenCV

    这几篇帖子讲的挺仔细的,而且不坑,结合看看就没问题了~~ http://www.cnblogs.com/cuteshongshong/p/4057193.html http://my.phirobot ...

  8. [Swust OJ 188]--异面空间(读懂题意很重要)

    题目链接:http://acm.swust.edu.cn/problem/188/ Time limit(ms): 1000 Memory limit(kb): 65535   江鸟来到了一个很奇怪的 ...

  9. 2015 款 Macbook Pro 的 ForceTouch 触控板开启 三指拖动

    RT, 默认的触控板设置中没有了三指拖动这个选项, 但是可以通过勾选 辅助功能 -> 鼠标与触控板 -> 触控板选项 中的 启用拖移 来启用三指拖动...

  10. iOS使用自定义字体

    http://blog.csdn.net/heartofthesea/article/details/22289399 1.将准备好的字体文件加入项目中 2.打开Build Phases—Copy B ...