bzoj3339 Rmq Problem

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

【题解】

业界偷懒。

突然发现好像可以主席树啊。。然后就强行上了一波发现确实可以。

第i棵主席树维护[1...i]这个前缀内,某权值区间的“最小出现位置”。

比如

2 3 0 1

那么在rt[4]这棵主席树中,[0,3]最小出现位置为1,是2在第1位;[0,1]最小出现位置为3,是0在第3位。

那么查询(x,y)我们查询rt[y]根据最小出现位置x来在主席树上二分走即可。

复杂度O(nlog(ai))

似乎可以线段树啊先mark

# 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 = 6e6 + 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-23 05:56:06

bzoj3339 Rmq Problem的相关文章

bzoj3339 rmq problem (range mex query)

给一个长度为n的数列a,q个询问,每次询问一段区间的mex.(没有出现过的最小非负整数) 1<=n,q<=200000,0<=ai<=200000. 题解1 莫队 我们将权值分成根号块,记录每个权值的出现次数和每块内有多少权值出现过. 修改和询问就直接暴力做就行. 修改O(1),询问O(sqrt(n)),加在一起还是O((n+q)sqrt(n+q)). #include <iostream> #include <stdio.h> #include <s

【莫队算法】【权值分块】bzoj3339 Rmq Problem

如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #define N 200001 #define BN 451 int n,m,a[N],b[N],sumv[BN],l[N],num[N],num2[N],Lim,siz[BN],anss[N]; struct Ask{int l,r,p;void Read(){scanf("%d%d",&am

【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 Output 30324 HINT 分析 离线算法. 对于[l,r]区间的询问,我们可以线性求出来,然后考虑[l+1,r]区间有什么不同,在a[l]下一次出现的位置之前,所有大于a[l]的mex,都变成是a[l],因为 [l+1,a[l]下一次出现的位置-1],这个区间内没有a[l]了,大于它的数当然

Rmq Problem

大视野——3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1192  Solved: 620[Submit][Status][Discuss] Description Input Output Sample Input 7 50 2 1 0 1 3 21 32 31 43 62 7 Sample Output 30324 HINT Source By Xhr 思路: 对于这个题似乎暴力不好打,而且似乎强制在线操作

【BZOJ】【3339】Rmq Problem

离线+线段树 Orz Hzwer,引用题解: 这一题在线似乎比较麻烦 至于离线.. 首先按照左端点将询问排序 然后一般可以这样考虑 首先如何得到1-i的sg值呢 这个可以一开始扫一遍完成 接着考虑l-r和l+1-r的答案有何不同 显然是l-next[l]-1这一段所有sg值大于a[l]的变为a[l] 这一步如果暴力修改的话只有30分 但是修改区间我们可以想到线段树,这样就能a了 晚上写题有点晕……忘了把当前时刻now置为q[i].l了,这种傻逼错误居然也犯…… 1 /**************

【BZOJ3489】A simple rmq problem kd-tree

[BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会采取一些措施强制在线. Input 第一行为两个整数N,M.M是询问数,N是序列的长度(N<=100000,M<=200000) 第二行为N个整数,描述这个序列{ai},其中所有1<=ai<=N 再下面M行,每

bzoj 3339: Rmq Problem

3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1270  Solved: 666[Submit][Status][Discuss] Description Input Output Sample Input 7 5 0 2 1 0 1 3 2 1 3 2 3 1 4 3 6 2 7 Sample Output 3 0 3 2 4 HINT Source By Xhr 嗯,莫队 懒得敲线段树,毕竟线段树比较短 #

AC日记——Periodic RMQ Problem codeforces 803G

G - Periodic RMQ Problem 思路: 题目给一段序列,然后序列复制很多次: 维护序列很多次后的性质: 线段树动态开点: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define maxn 100005 struct TreeNodeType { int l, r, mid

(WAWAWAWAWAWAW) G. Periodic RMQ Problem

没有联通门 : Codeforces G. Periodic RMQ Problem /* Codeforces G. Periodic RMQ Problem MMP 什么动态开点线段树啊 ... YY了个非常可行的做法 码完后交一下发现RE了几个点.. 就思考哪里有问题 突然之间, 老泪纵横.. MMP 我写了这是个什么玩意啊 仔细想想我TM不就是写了个全空间的主席树吗....脑子有病啊.. 静言思之, 躬自悼矣..反是不思,亦已焉哉 不写啦! */ #include <cmath> #i