zoukankan      html  css  js  c++  java
  • BZOJ3585 mex

    首先我们可以想到离线,于是什么线段树啊随便维护一下就好了

    然后我比较傻,只会莫队。。。

    由于ans ≤ n,我们可以对ans分块,于是每次修改的复杂度是O(1)的,询问的复杂度是O(√n)

    总复杂度O(m√n + n√n)

     1 /**************************************************************
     2     Problem: 3585
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:9756 ms
     7     Memory:7068 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <cmath>
    12 #include <algorithm>
    13  
    14 using namespace std;
    15 const int N = 200005;
    16 const int B = 505;
    17  
    18 int n, Q;
    19 int sz, cnt_block;
    20 int a[N], b[N], cnt[N], st[B];
    21 int l, r, block_cnt[N], ans[N];
    22  
    23 struct query{
    24     int l, r, w;
    25  
    26     inline bool operator < (const query x) const {
    27         return b[l] == b[x.l] ? r < x.r : b[l] < b[x.l];
    28     }
    29 } q[N];
    30  
    31 inline int read() {
    32     int x = 0;
    33     char ch = getchar();
    34     while (ch < '0' || '9' < ch)
    35         ch = getchar();
    36     while ('0' <= ch && ch <= '9') {
    37         x = x * 10 + ch - '0';
    38         ch = getchar();
    39     }
    40     return x;
    41 }
    42  
    43 void update(int x, int del) {
    44     if (x > n) return;
    45     if (cnt[x] == 0) ++block_cnt[b[x]];
    46     cnt[x] += del;
    47     if (cnt[x] == 0) --block_cnt[b[x]];
    48 }
    49  
    50 int Query() {
    51     int i;
    52     if (!cnt[0]) return 0;
    53     for (i = 1; i <= cnt_block; ++i)
    54         if (block_cnt[i] != st[i + 1] - st[i]) break;
    55     for (i = st[i]; i < n; ++i)
    56     if (!cnt[i]) return i;
    57     return n;
    58 }
    59  
    60 int main() {
    61     int i;
    62     n = read(), Q = read();
    63     sz = (int) sqrt(n);
    64     if (!sz) sz = 1;
    65     for (i = 1; i <= n; ++i) {
    66         if (i % sz == 1 || sz == 1) 
    67         st[++cnt_block] = i;
    68         b[i] = cnt_block;
    69     }
    70     st[cnt_block + 1] = n + 1;
    71  
    72     for (i = 1; i <= n; ++i) a[i] = read();
    73     for (i = 1; i <= Q; ++i)
    74         q[i].l = read(), q[i].r = read(), q[i].w = i;
    75     sort(q + 1, q + Q + 1);
    76     for (i = l = 1, r = 0; i <= Q; ++i) {
    77         for (; l < q[i].l; ) update(a[l++], -1);
    78         for (; l > q[i].l; ) update(a[--l], 1);
    79         for (; r < q[i].r; ) update(a[++r], 1);
    80         for (; r > q[i].r; ) update(a[r--], -1);
    81         ans[q[i].w] = Query();
    82     }
    83     for (i = 1; i <= Q; ++i)
    84         printf("%d
    ", ans[i]);
    85     return 0;
    86 }
    View Code

     (p.s. 啊太慢什么的。。。这个嘛呵呵呵。。。不要在意这种细节嘛恩恩)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    谁的朱砂痣染白了谁的白月光
    随机数
    常见面试简单汇总整理
    oss分页列举遍历文件创建软链接
    oss创建软链接
    看英文文档的好处
    js原型链相关
    js 中的this指向问题
    jquery.fn.init
    转载
  • 原文地址:https://www.cnblogs.com/rausen/p/4298168.html
Copyright © 2011-2022 走看看