离线, 询问排序.

先处理出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. r语言之散点图类型type参数

    type参数用来控制所生成散点图的类型,有如下几个选项: type=“p”表示绘制单独的点 type=“l”表示绘制点连成的折线 type=“b”表示有线连接的点 type=“o”表示将点绘在线上 t ...

  2. JS 移动动画

    function moveElement(elementId, final_x, final_y,interval) {            if (!document.getElementById ...

  3. HDU 2570:迷瘴

    迷瘴 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. windows desktop.ini

    win7桌面上的两个desktop.ini文件千万不要删除,win7系统里的desktop.ini文件是有用的. 详解 Desktop.ini 配置设置文件1 http://blog.sina.com ...

  5. SGU 183. Painting the balls( dp )

    dp..dp(i, j)表示画两个点为i-j, i的最优答案. dp(i, j) = min{ dp(i-j, k) } + cost[i] (1≤k≤M-j) 令f(i, j) = min{dp(i ...

  6. vhost文件设置

    #例子<VirtualHost *.82> #设置端口号为82 ServerName localhost #服务器名称 DocumentRoot "d:/Web" #文 ...

  7. django1.6读书笔记一

    reporter是Article中的一个外键,我们可以有多篇文章指向同一个reporter,然后通过使用article_set.all()就可以返回其所有的headline了,也可以添加条件来筛选. ...

  8. 用python解析html

    python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib.他们的实现方法不通,但功能差不多.这三个库中 提供解析html的类都是基类,本身并不做具体的工作.他 ...

  9. MYSQ提高L查询效率的策略总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值推断,否则将导致引擎放弃使用索 ...

  10. 大整数乘法python3实现

    因为python具有无限精度的int类型,所以用python实现大整数乘法是没意义的,可是思想是一样的.利用的规律是:第一个数的第i位和第二个数大第j位相乘,一定累加到结果的第i+j位上,这里是从0位 ...