bzoj3585 mex

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3585

【题解】

哎好像就是上题啊

怎么权值是1e9了啊

那没关系啊把主席树调成[0,1e9]的就行啦

哎调调空间

过了

# include <stdio.h>
# include <string.h>
# include <algorithm>
// # include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + 10;
const int mod = 1e9+7;

# define RG register
# define ST static

int n, m;

int rt[M];
namespace CMT {
    const int M = 1e7 + 10;
    int s[M], ch[M][2], siz;
    inline void change(int &x, int y, int l, int r, int pos, int va) {
        x = ++siz; ch[x][0] = ch[y][0]; ch[x][1] = ch[y][1];
        if(l==r) {
            s[x] = va;
            return ;
        }
        int mid = l+r>>1;
        if(pos <= mid) change(ch[x][0], ch[y][0], l, mid, pos, va);
        else change(ch[x][1], ch[y][1], mid+1, r, pos, va);
        s[x] = min(s[ch[x][0]], s[ch[x][1]]);
    }
    inline int mex(int x, int l, int r, int pos) {
        if(l == r) return l;
        int mid = l+r>>1;
        if(s[ch[x][0]] >= pos) return mex(ch[x][1], mid+1, r, pos);
        else return mex(ch[x][0], l, mid, pos);
    }
}

int main() {
    scanf("%d%d", &n, &m);
    for (int i=1, t; i<=n; ++i) {
        scanf("%d", &t);
        CMT::change(rt[i], rt[i-1], 0, 1e9, t, i);
    }
    while(m--) {
        int x, y; scanf("%d%d", &x, &y);
        printf("%d\n", CMT::mex(rt[y], 0, 1e9, x));
    }
    return 0;
}

时间: 2024-10-14 11:14:30

bzoj3585 mex的相关文章

【莫队算法】【权值分块】bzoj3585 mex

orz PoPoQQQ. 本来蒟蒻以为这种离散化以后就对应不起来的题不能权值分块搞的说. ……结果,实际上>n的权值不会对答案作出贡献. #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 200002 #define BN 452 int n,m,num[N],a[N],l[BN],size[BN],anss[N],b[N],sumv[BN]; s

[BZOJ3585][BZOJ3339]mex

试题描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入 第一行n,m.第二行为n个数.从第三行开始,每行一个询问l,r. 输出 一行一个数,表示每个询问的答案. 输入示例 5 5 2 1 0 2 1 3 3 2 3 2 4 1 2 3 5 输出示例 1 2 3 0 3 数据规模及约定 对于100%的数据:1<=n,m<=2000000<=ai<=1091<=l<=r<=n 题解 首先离线,将询问按右端

BZOJ3339:Rmq Problem &amp; BZOJ3585 &amp; 洛谷4137:mex——题解

前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339 后者: https://www.lydsy.com/JudgeOnline/problem.php?id=3585 https://www.luogu.org/problemnew/show/P4137 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 题解大部分都是莫队分块,但是复杂度为O(n*sqrt(n))=5e2*2e5=1e

matlab-bgl 工具包配置环境 TDM-GCC-64 mex

Windows 64 + Matlab 64 MEX混合编程初步: http://blog.csdn.net/enjoyyl/article/details/46545263 使用的是 TDM-GCCgccg For Matlab 2015 TDM-GCC-64 来自 51CTO下载-tdm64-gcc-4.9.2-3.zip matlab-bgl工具包下载: http://www.pudn.com/downloads737/sourcecode/math/detail2943220.html

HDU #4747 MEX

题目描述: 定义 mex(i, j) 为序列中第 i 项到第 j 项中没有出现的最小自然数.给定序列,求 Σ1≤i,j≤n,i≤j mex(i, j). 解题思路: 首先我们可以 O(n) 预处理出 mex(1, 1 ~ n),因为显然的是mex是递增的.然后我们考虑怎么从 mex(i, i ~ n) 推出 mex(i + 1, i + 1 ~ n),我们删掉 a[i] 这个数后,哪些区间的mex会改变呢?其实就是到下一个a[i]出现前mex大于a[i]的区间,因为这段区间没有了a[i]这个数,

在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32

csunking贡献,2015-9-22 1712 1.   概述 通过使用C/C++与Matlab混合编程,既可以享受到C代码快速执行的速度,又可以方便的使用Matlab众多的库函数和强大的绘图功能.让Matlab调用C函数是通过DLL文件实现的,而这个DLL的开发过程不仅仅可以使用Matlab自带的mex命令,还可以使用VC++开发环境,使用VC有很多好处,一是让我回到了原来熟悉的开发环境中,二能够使用更加标准的C++编译器,第三点也是最爽的,可以使用VC强大的调试功能. 此次文档更新时使用

MEX程序中的mexFunction函数【转】

与C中的main函数一样,MEX程序中的开始函数为mexFunction.默认变量参数是: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 其中 nlhs输出参数数目 plhs[]指向输出参数的指针 nrhs输入参数的数目 prhs[]指向输入参数的指针 例如:使用[a,b]=test(c,d,e) 调用mex函数test时,传给test的这三个参数分别是prhs[0]=c ,prhs[1]

Educational Codeforces Round 23 F. MEX Queries(线段树)

题目链接:Educational Codeforces Round 23 F. MEX Queries 题意: 一共有n个操作. 1.  将[l,r]区间的数标记为1. 2.  将[l,r]区间的数标记为0. 3.  将[l,r]区间取反. 对每个操作,输出标记为0的最小正整数. 题解: hash后,用线段树xjb标记一下就行了. 1 #include<bits/stdc++.h> 2 #define ls l,m,rt<<1 3 #define rs m+1,r,rt<&l

编写 Matlab mexFunction (C mex)

资料一 MATLAB的MEX文件编写和调试 1. MEX的编写格式 写MEX程序其实就是写一个DLL程序,所以你可以使用C,C++,Fortran等多种编程语言来写. 编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等. 用MATLAB的编辑器的好处是,MEX函数会加粗高亮显示,这给程序编写带来便利,可惜无法动态调试.如用VC即可编译也可调试,比较方便.mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以会用VC编写