QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#841366#3746. 千万别用树套树billfWA 856ms8672kbC++202.8kb2025-01-03 17:33:022025-01-03 17:33:04

Judging History

This is the latest submission verdict.

  • [2025-01-03 17:33:04]
  • Judged
  • Verdict: WA
  • Time: 856ms
  • Memory: 8672kb
  • [2025-01-03 17:33:02]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, M = N;
int n, q, a[N], c[3][N];
mt19937 Rnd(1);
struct FHQ
{
    int tot, lc[M], rc[M], siz[M], vl[M], rd[M], rt;
    void pushup(int p)
    {
        siz[p] = siz[lc[p]] + siz[rc[p]] + 1;
    }
    void split(int p, int v, int &l, int &r)
    {
        if (!p)
            return l = r = 0, void();
        if (vl[p] <= v)
            l = p, split(rc[p], v, rc[p], r);
        else
            r = p, split(lc[p], v, l, lc[p]);
        pushup(p);
    }
    int merge(int p, int q)
    {
        if (!p || !q)
            return p + q;
        if (rd[p] < rd[q])
        {
            rc[p] = merge(rc[p], q);
            pushup(p);
            return p;
        }
        else
        {
            lc[q] = merge(p, lc[q]);
            pushup(q);
            return q;
        }
    }
    int newn(int x)
    {
        tot++;
        lc[tot] = rc[tot] = 0;
        siz[tot] = 1;
        vl[tot] = x;
        rd[tot] = Rnd();
        return tot;
    }
    void irt(int x)
    {
        int p, q;
        split(rt, x, p, q);
        rt = merge(merge(p, newn(x)), q);
    }
    void dlt(int x)
    {
        int p, q, p1, q1;
        split(rt, x, p, q);
        split(p, x - 1, p1, q1);
        p = merge(lc[q1], rc[q1]);
        rt = merge(merge(p1, p), q);
    }
    int grk(int x)
    {
        int p, q, res;
        split(rt, x, p, q);
        res = siz[p];
        rt = merge(p, q);
        return res;
    }
    int kth(int p, int x)
    {
        int lf = siz[lc[p]] + 1;
        if (x == lf)
            return vl[p];
        if (x < lf)
            return kth(lc[p], x);
        else
            return kth(rc[p], x - lf);
    }
    int ask(int x, int y)
    {
        if (!rt)
            return 0;
        int p, q, p1, q1;
        split(rt, y, p, q);
        split(p, x - 1, p1, q1);
        int res = siz[q1];
        rt = merge(merge(p1, q1), q);
        return res;
    }
} ll, rr;
int main()
{
    while (scanf("%d%d", &n, &q) != EOF)
    {
        ll.tot = ll.rt = 0;
        rr.tot = rr.rt = 0;
        int all = 0;
        while (q--)
        {
            int op, x, y, res = 0;
            scanf("%d%d%d", &op, &x, &y);
            if (op == 1)
            {
                if (y - x <= 2)
                    c[y - x][x]++;
                else
                    ll.irt(y), rr.irt(x), all++;
            }
            else
            {
                res = all;
                for (int i = y - x; i <= 2; i++)
                {
                    for (int j = y - i; j <= x; j++)
                        res += c[i][j];
                }
                res -= ll.ask(-100, x - 1);
                res -= rr.ask(y + 1, n + 100);
                printf("%d\n", res);
            }
        }
        for (int i : {0, 1, 2})
            fill(c[i], c[i] + n + 1, 0);
    }
    return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 856ms
memory: 8672kb

input:

100000 100000
1 48500 63742
1 43673 89780
1 6471 44388
1 68054 71541
1 30056 91431
1 49687 70537
2 46899 46900
1 5165 57954
1 85892 88481
2 18060 18062
2 45289 45289
1 18927 67848
1 17389 96139
1 63451 92197
1 15473 87341
1 15162 15744
1 76728 99645
2 48730 48731
2 20886 20888
1 9756 67424
1 23175 4...

output:

2
2
3
7
5
8
9
4
6
2
11
13
13
10
13
15
9
10
14
16
17
16
16
15
2
4
11
6
11
12
23
9
26
3
28
20
12
12
22
30
5
27
6
29
10
14
27
6
17
15
9
30
20
34
7
36
15
8
32
16
21
40
19
2
1
12
12
39
37
13
19
20
1
9
37
1
41
40
20
34
45
43
27
30
47
29
13
50
41
44
29
35
38
53
2
46
54
36
56
58
45
32
42
26
52
42
60
1
4
25
...

result:

wrong answer 511th numbers differ - expected: '123', found: '124'