线段树+离线

这种题既可以用莫队做也可以用线段树做,跟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. linux目录文件操作

    一.linux系统目录结构 1.顶层根目录 顶层根目录使用 “/”来表示 2.linux中的一些重要目录 (1)bin目录 放置常用的可执行文件(其中ls命令位列其中) (2)sbin目录 放置系统的 ...

  2. Poj 2187 旋转卡壳

    Poj 2187 旋转卡壳求解 传送门 旋转卡壳,是利用凸包性质来求解凸包最长点对的线性算法,我们逐渐改变每一次方向,然后枚举出这个方向上的踵点对(最远点对),类似于用游标卡尺卡着凸包旋转一周,答案就 ...

  3. Vue如何实现swiper左右滑动内容区控制导航tab同时切换高亮

    Vue如何实现左右滑动内容区控制导航tab同时切换高亮,实现的效果是:点击导航按钮时内容区发生改变,左右滑动内容区时导航按钮跟随切换高亮,停留在某个内容区时刷新页面后仍然停留在当前内容区.       ...

  4. windows下mysql使用实录

    之前密码忘了,卸载重装,配置好环境变量,登录,成功 操作命令可参考http://www.runoob.com/mysql/mysql-tutorial.html 这里只列举了我需要用到的命令 登录:m ...

  5. 史上最全Java多线程面试题及答案

    多线程有什么用? 线程和进程的区别是什么? Java实现线程有哪几种方式? 启动线程方法start()和run()有什么区别? 怎么终止一个线程?如何优雅地终止线程? 一个线程的生命周期有哪几种状态? ...

  6. xtu summer individual-4 A - Beautiful IP Addresses

    Beautiful IP Addresses Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on Code ...

  7. IDA-IDC脚本编写语法

    1.IDA脚本编写基础 IDC是IDA内置的脚本语言,其语法与C非常相似,它是一种解释性语言. 执行方法 在IDA中按SHIFT+F2键会弹出一个对话框,把语句直接写在对话框中,点击run就可被运行. ...

  8. 一起去打CS(codevs 5059)

    题目描述 Description 早就和lyk约好了去打cs,一直没找着时间,终于今天我家没人,他家也没人,总算可以出去了.但是偏偏天公不作美,某某人非要留那么多题要做.没办法只能尽快做完然后抓紧时间 ...

  9. Codeforces704C. Black Widow

    n<=1e5个值v,分别由<=1e5的m个变量中的1<=ki<=2个布尔变量xj(或某个变量取反)或起来组成,而所有的v异或起来为1,一个x不会在输入数据中出现超过2次,包括他 ...

  10. Layui弹出层、日期和时间选择、即时通讯、分页

    Layui弹出层.日期和时间选择.即时通讯.分页 弹层组件文档 - layui.layer 对于弹出层的感觉是:layer 至今仍作为 layui 的代表作,她的受众广泛并非偶然,而是这数年来的坚持. ...