离线, 询问排序.

先处理出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

By 佚名提供

转载于:https://www.cnblogs.com/JSZX11556/p/4708066.html

BZOJ 3585: mex( 离线 + 线段树 )相关推荐

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

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

  2. HDU 4417 Super Mario(离线线段树or树状数组)

    Problem Description Mario is world-famous plumber. His "burly" figure and amazing jumping ...

  3. CodeForces - 817F MEX Queries(线段树lazy序)

    题目链接:点击查看 题目大意:初始时有一个空的集合,需要执行 n 次操作: 1 l r:将区间 [ l , r ] 内未出现的数加入到集合中 2 l r:将区间 [ l , r ] 内出现的数字全部删 ...

  4. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

  5. 20.CF817F MEX Queries 线段树(Lazy标记练习)

    20.CF817F MEX Queries 离散化+区间覆盖+区间反转线段树 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 要求维护 ...

  6. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  7. BZOJ 2124 等差子序列 线段树维护哈希

    $ \Rightarrow $ 戳我进BZOJ原题 等差子序列 Time Limit: 3 Sec $ \quad $ Memory Limit: 259 MB Description 给一个 $ 1 ...

  8. HDU - 4747 Mex(线段树)

    题意: 计算    其中mex即为博弈中出现的mex(未出现的最小非负整数). 分析: 有两种方法,递推有点懵(以后再来补QAQ),就写了线段树 想法是每次求以i为起点的区间的mex值的和,最后累加即 ...

  9. CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化

    题目链接: http://codeforces.com/contest/19/problem/D 题意: 有三种操作"add x y"往平面上添加(x,y)这个点,"re ...

最新文章

  1. 小模型实现大一统!FBNetV5一举包揽CV任务3个SOTA
  2. mysql索引 钱缀_-MySQL索引背后的数据结构及算法原理--索引选择性与前缀索引
  3. 基于事件驱动架构构建微服务第13部分:使用来自Apache KAFKA的事件并将投影流传输到ElasticSearch...
  4. FastStone Capture 注册码 序列号
  5. 错误 执行Transact-SQL语句批处理时发生了异常。无法设置主体'sa'的凭据
  6. 2018 蓝桥杯省赛 B 组模拟赛(五)题 G题
  7. Windows压力测试工具SuperBenchmarker
  8. 胡适:一个最低限度的国学书目
  9. 考研英语 - word-list-30
  10. md5加密算法c语言版
  11. JS点击图片后图片放大效果
  12. 三极管共射放大电路静态工作点怎么设计
  13. 一文深入掌握druid
  14. C语言基础题集(课前:一维数组,二维数组)
  15. 画图软件Java实现(面向对象程序设计)
  16. 基于K近邻的葡萄酒质量检测项目
  17. Photoshop CC2019 快捷键壁纸 快捷键大全
  18. 前端面试总结(转载请标明)
  19. 【夏目鬼鬼分享】RabbitMQ路由模式
  20. 这里面70%以上的我都知道。还是普及给那些不知道的人吧

热门文章

  1. 伍六七带你学算法 进阶篇-三数之和
  2. 【UML建模】UML图详细总结
  3. xgboost重要参数1
  4. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词
  5. python中的next()以及iter()函数
  6. 在idea中移除子模块Moudle后重新导入
  7. LeetCode简单题之两个相同字符之间的最长子字符串
  8. Nginx最新版安装教程(Windows+Linux)
  9. YOLOv5目标检测源码重磅发布了!
  10. Python:Scrapy的settings