QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#428485#964. Excluded MinEstelle_NWA 5ms24408kbC++145.2kb2024-06-01 19:47:512024-06-01 19:47:52

Judging History

你现在查看的是最新测评结果

  • [2024-06-01 19:47:52]
  • 评测
  • 测评结果:WA
  • 用时:5ms
  • 内存:24408kb
  • [2024-06-01 19:47:51]
  • 提交

answer

#include <set>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 500005;

int n, m, a[N], c[N], ans[N];
vector <int> p[N];

struct Query
{
    int l, r, id;
};
Query q[N];

struct SegmentTree
{
    struct Node
    {
        int Max, pos;
    };
    struct Tree
    {
        int l, r, Max, pos, add;
    };
    Tree s[N << 2];

    #define ls p << 1
    #define rs p << 1 | 1

    void build(int p, int l, int r)
    {
        s[p].l = l;
        s[p].r = r;
        s[p].pos = l;
        if(l == r)
            return;
        int mid = l + r >> 1;
        build(ls, l, mid);
        build(rs, mid + 1, r);
    }

    void push_down(int p)
    {
        s[ls].add += s[p].add;
        s[ls].Max += s[p].add;
        s[rs].add += s[p].add;
        s[rs].Max += s[p].add;
        s[p].add = 0;
    }

    void push_up(int p)
    {
        s[p].Max = max(s[ls].Max, s[rs].Max);
        if(s[ls].Max >= s[rs].Max)
            s[p].pos = s[ls].pos;
        else
            s[p].pos = s[rs].pos;
    }

    void Add(int p, int l, int r, int k)
    {
        if(s[p].l >= l && s[p].r <= r)
        {
            s[p].add += k;
            s[p].Max += k;
            return;
        }
        push_down(p);
        int mid = s[p].l + s[p].r >> 1;
        if(l <= mid)
            Add(ls, l, r, k);
        if(r > mid)
            Add(rs, l, r, k);
        push_up(p);
    }

    void Upd(int p, int x, int k)
    {
        if(s[p].l == s[p].r)
        {
            s[p].Max = k;
            return;
        }
        push_down(p);
        int mid = s[p].l + s[p].r >> 1;
        if(x <= mid)
            Upd(ls, x, k);
        else
            Upd(rs, x, k);
        push_up(p);
    }

    Node maxNode(Node x, Node y)
    {
        if(x.Max >= y.Max)
            return x;
        return y;
    }

    Node Get(int p, int l, int r)
    {
        if(s[p].l >= l && s[p].r <= r)
            return (Node){s[p].Max, s[p].pos};
        push_down(p);
        int mid = s[p].l + s[p].r >> 1;
        if(r <= mid)
            return Get(ls, l, r);
        if(l > mid)
            return Get(rs, l, r);
        return maxNode(Get(ls, l, r), Get(rs, l, r));
    }
};
SegmentTree S, T;

set < pair<int, int> > lpos, rpos;

void add(int x, int k)
{
    for(; x <= n; x += x & -x)
        c[x] += k;
}

int get(int x)
{
    int r = 0;
    for(; x; x -= x & -x)
        r += c[x];
    return r;
}

int main()
{
    // freopen("S.in", "r", stdin);
    // freopen("A.out", "w", stdout);

    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++ i)
        scanf("%d", &a[i]), p[a[i]].push_back(i), add(i, 1);
    for(int i = 1; i <= m; ++ i)
        scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;

    sort(q + 1, q + 1 + m, [](Query i, Query j)
        { return i.l == j.l ? i.r > j.r : i.l < j.l;});

    T.build(1, 1, m);
    S.build(1, 1, m);
    for(int i = 1, R = 0; i <= m; ++ i)
    {
        if(q[i].l == q[i - 1].l || q[i].r <= R)
        {
            S.Upd(1, i, q[i].r);
            T.Upd(1, i, -1e9);
        }
        else
        {
            R = q[i].r;
            T.Upd(1, i, q[i].r - q[i].l + 1);
            lpos.insert(make_pair(q[i].l, i));
            rpos.insert(make_pair(q[i].r, i));
        }    
    }

    for(int i = n; i >= 0; -- i)
    {
        for(int u : p[i])
        {
            add(u, -1);
            auto itl = lpos.upper_bound(make_pair(u, N));
            auto itr = rpos.lower_bound(make_pair(u, 0));
            // printf("{%d, %d}, {%d, %d}\n", itl -> first, itl -> second, itr -> first, itr -> second);
            if(itl != lpos.begin() && itr != rpos.end() && prev(itl) -> second >= itr -> second)
                T.Add(1, itr -> second, prev(itl) -> second, -1);
        }
        while(T.s[1].Max >= i)
        {
            int u = T.s[1].pos, r, R;
            ans[q[u].id] = i;
            lpos.erase(make_pair(q[u].l, u));
            rpos.erase(make_pair(q[u].r, u));
            if(lpos.size() == 0)
            {
                r = m;
                R = 0;
            }
            else
            {
                auto itr = lpos.upper_bound(make_pair(q[u].l, u));
                r = (itr == lpos.end() ? m : itr -> second);
                R = (itr == lpos.begin() ? 0 : prev(itr) -> first);
                if(itr == lpos.end() && prev(itr) -> second == u)
                    R = 0;
            }

            if(u + 1 <= r)
            {
                SegmentTree::Node x = S.Get(1, u + 1, r);
                while(u + 1 <= r && x.Max > 0 && q[x.pos].r > R)
                {
                    r = x.pos - 1;
                    lpos.insert(make_pair(q[x.pos].l, x.pos));
                    rpos.insert(make_pair(q[x.pos].r, x.pos));
                    S.Upd(1, x.pos, 0);
                    T.Upd(1, x.pos, get(q[x.pos].r) - get(q[x.pos].l - 1));
                    if(u + 1 <= r)
                        x = S.Get(1, u + 1, r);
                }
            }
            T.Upd(1, u, -1e9);
        }
    }

    for(int i = 1; i <= m; ++ i)
        printf("%d\n", ans[i]);

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 5ms
memory: 24348kb

input:

3 3
0 0 2
1 3
2 3
3 3

output:

3
1
0

result:

ok 3 number(s): "3 1 0"

Test #2:

score: 0
Accepted
time: 5ms
memory: 24408kb

input:

3 2
1 2 2
1 2
1 3

output:

0
3

result:

ok 2 number(s): "0 3"

Test #3:

score: 0
Accepted
time: 0ms
memory: 22384kb

input:

10 10
3 0 3 3 9 7 9 6 0 7
3 3
9 9
4 6
1 9
3 4
2 4
7 10
3 7
5 7
2 7

output:

0
1
0
5
0
1
1
0
0
1

result:

ok 10 numbers

Test #4:

score: 0
Accepted
time: 3ms
memory: 24296kb

input:

10 10
3 0 0 0 5 1 1 1 2 1
1 2
8 8
5 7
1 7
2 2
1 5
5 6
4 6
3 10
6 8

output:

1
0
2
7
1
4
0
2
8
3

result:

ok 10 numbers

Test #5:

score: -100
Wrong Answer
time: 3ms
memory: 22408kb

input:

100 100
15 82 7 39 63 55 64 99 71 63 32 99 67 94 3 43 15 75 45 55 53 4 35 36 15 40 82 20 62 43 6 83 27 95 27 45 98 44 35 98 39 7 17 32 76 7 40 16 40 63 13 8 22 27 11 12 61 14 19 45 100 97 90 88 22 59 25 63 4 25 65 16 22 92 84 44 99 66 89 26 93 97 35 97 92 1 32 40 97 97 78 43 7 12 23 53 61 74 33 90
1...

output:

68
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
19
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
28
0
0
0
0
0
0
0
0
0
0
48
0
0
0
0
0
0
0
0
0
0
0
0
0
28
0
0
0
19
0
0
0
0
0
0
0
0
0
0
23
0
0
0
0
0
0
0
0

result:

wrong answer 28th numbers differ - expected: '0', found: '19'