线段树+离线

这种题既可以用莫队做也可以用线段树做,跟hh的项链差不多

首先我们处里出前缀mex,也就是1->i的mex值,再预处理出每个数下一次出现的位置,然后把每个前缀mex插入线段树,每个节点表示l==r表示1->l的mex,然后把询问按左端点排序,依次查询,修改每次把小于当前左端点的数的影响去除,也就是把i->nxt[i-1]的mex和a[i]取min,因为这些前缀mex的a[i]消失了,那么取min就是新答案,每次查询就是单点查询,也就是查询1->r的前缀mex,因为1-l-1的影响都被消除了,所以现在1-r的答案就是l-r的答案

#include<bits/stdc++.h>
using namespace std;
const int N = , inf = 0x3f3f3f3f;
struct query_ {
int l, r, id;
bool friend operator < (query_ A, query_ B) {
return A.l < B.l;
}
} q[N];
int n, m;
int nxt[N], tree[N << ], tag[N << ], a[N], ans[N], vis[N], last[N];
void pushdown(int x)
{
if(tag[x] == inf) return;
tag[x << ] = min(tag[x << ], tag[x]);
tag[x << | ] = min(tag[x << | ], tag[x]);
tree[x << ] = min(tree[x << ], tag[x]);
tree[x << | ] = min(tree[x << | ], tag[x]);
tag[x] = inf;
}
void update(int l, int r, int x, int a, int b, int mn)
{
if(l > b || r < a) return;
if(l >= a && r <= b)
{
tag[x] = min(tag[x], mn);
tree[x] = min(tree[x], mn);
return;
}
pushdown(x);
int mid = (l + r) >> ;
update(l, mid, x << , a, b, mn);
update(mid + , r, x << | , a, b, mn);
tree[x] = min(tree[x << ], tree[x << | ]);
}
int query(int l, int r, int x, int pos)
{
if(l == r)
{
// printf("l = %d r = %d pos = %d tree[%d] = %d\n", l, r, pos, x, tree[x]);
return tree[x];
}
pushdown(x);
int mid = (l + r) >> ;
if(pos <= mid) return query(l, mid, x << , pos);
else return query(mid + , r, x << | , pos);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i) scanf("%d", &a[i]);
for(int i = ; i <= m; ++i) scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;
sort(q + , q + m + );
int pos = ;
memset(tree, 0x3f3f, sizeof(tree));
memset(tag, 0x3f3f, sizeof(tag));
for(int i = ; i <= n; ++i)
{
nxt[last[a[i]]] = i;
last[a[i]] = i;
vis[a[i]] = ;
while(vis[pos]) ++pos;
// printf("i = %d pos = %d\n", i, pos);
update(, n, , i, i, pos);
}
for(int i = ; i <= n; ++i) if(nxt[i] == ) nxt[i] = n + ;
pos = ;
for(int i = ; i <= m; ++i)
{
while(pos < q[i].l && pos <= n)
{
update(, n, , pos, nxt[pos] - , a[pos]);
// printf("pos = %d nxt[%d] = %d a[%d] = %d\n", pos, pos, nxt[pos], pos, a[pos]);
++pos;
}
// printf("q[%d].l = %d q[%d].r = %d id = %d pos = %d\n", i, q[i].l, i, q[i].r, q[i].id, pos);
ans[q[i].id] = query(, n, , q[i].r);
}
for(int i = ; i <= m; ++i) printf("%d\n", ans[i]);
return ;
}

bzoj3339的更多相关文章

  1. 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 ...

  2. 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex

    题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...

  3. 【bzoj3339】Rmq Problem

    [bzoj3339]Rmq Problem   Description Input Output Sample Input 7 50 2 1 0 1 3 21 32 31 43 62 7 Sample ...

  4. [BZOJ3585][BZOJ3339]mex

    [BZOJ3585][BZOJ3339]mex 试题描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入 第一行n,m.第二行为n个数.从 ...

  5. [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树

    Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...

  6. BZOJ3339&&3585 Rmq Problem&&mex

    BZOJ3339&&3585:Rmq Problem&&mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最 ...

  7. bzoj3339 rmq problem (range mex query)

    给一个长度为n的数列a,q个询问,每次询问一段区间的mex.(没有出现过的最小非负整数) 1<=n,q<=200000,0<=ai<=200000. 题解1 莫队 我们将权值分 ...

  8. bzoj3339 bzoj3585

    两题本质是一样,只不过3585要离散化这种不修改,不强制的问题,显然先考虑离线算法这道题的思路和bzoj1878非常像考虑到如果只是求每个前缀的mex,我们是很容易扫一遍就得出来的我们设为这个位置的m ...

  9. Rmq Problem/mex BZOJ3339 BZOJ3585

    分析: 一开始没看懂题... 后来想用二分答案却不会验证... 之后,想到用主席树来维护... 建一个权值线段树,维护出这个权值以前所有的点最晚在哪里出现... 之后,查一下是不是比查询区间的l断点大 ...

  10. [BZOJ3339]Rmq Problem / mex

    Description: 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Hint: \(n \le 2*10^5\) Solution: 主席树好 ...

随机推荐

  1. 测试自动化接口jenkins配置

    <br/><font color="red" size"3" face="微软雅黑">本邮件是程序自动下发,请勿回复 ...

  2. nyoj 96 n-1位数(处理前导 0 的情况)(string)

    n-1位数 时间限制:3000 ms  |            内存限制:65535 KB 难度:1   描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则 ...

  3. 582. Kill Process

    Problem statement: Given n processes, each process has a unique PID (process id) and its PPID (paren ...

  4. Quartz.net框架使用

    概述:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  5. iframe显示滚动条

    子页面通过iframe加载,出现了竖向滚动条 最后查出原因:文档申明 iframe有滚动条的页面的文档申明 <!DOCTYPE html> 改成如下就行了 <!DOCTYPE HTM ...

  6. server证书安装配置指南(Tomcat 6)

    一.   生成证书请求   1.  安装JDK 安装Tomcat须要JDK支持. 假设您还没有JDK的安装.则能够參考 Java SE Development Kit (JDK) 下载. 下载地址: ...

  7. C++ - 库函数优先级队列(priority_queue)输出最小值 代码

    库函数优先级队列(priority_queue)输出最小值 代码 本文地址: http://blog.csdn.net/caroline_wendy 库函数优先级队列(priority_queue)的 ...

  8. [AngularJS 1.6] ngModelOptions and inheritance

    Problem with ngModleOptions before 1.6: <input type="text" name="fullname" ng ...

  9. UML中的四种关系总结

    UML中的关系主要包含四种:关联关系.依赖关系.泛化关系.实现关系.当中关联关系还包含聚合关系和组合关系. 1. 关联关系(Association) 关联关系式一种结构化的关系,是指一种对象和还有一种 ...

  10. react 项目实战(一)创建项目 及 服务端搭建

    1.安装 React社区提供了众多的脚手架,这里我们使用官方推荐的create-react-app. //安装脚手架 npm install -g create-react-app //生成并运行项目 ...