QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#758202#6608. Descent of DragonsAlorithmWA 1ms5476kbC++172.5kb2024-11-17 16:41:012024-11-17 16:41:02

Judging History

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

  • [2024-11-17 16:41:02]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5476kb
  • [2024-11-17 16:41:01]
  • 提交

answer

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
using i64 = long long;

struct SegTree {
    int n, cnt;
    vector<int> ls, rs;
    vector<bool> val;

    SegTree(int N = 0) : n(N) {
        cnt = 0;
        ls.resize(n << 5);
        rs.resize(n << 5);
        val.resize(n << 5);
    }

    int new_node() {
        return ++cnt;
    }

    void updata(int p) {
        val[p] = val[ls[p]] | val[rs[p]];
    }

    void build(int& p, int l, int r) {
        if (!p)
            p = new_node();

        if (l == r) {
            val[p] = true;
            return;
        }

        int mid = (l + r) >> 1;
        build(ls[p], l, mid);
        build(rs[p], mid + 1, r);
        updata(p);
    }

    void merge(int& p1, int& p2, int s, int t, int l, int r) {
        if (s <= l && r <= t) {
            p1 = p2;
            return;
        }

        if (!p2)
            return;

        if (!p1)
            p1 = new_node();

        int mid = (l + r) >> 1;
        if (s <= mid)
            merge(ls[p1], ls[p2], s, t, l, mid);
        if (mid + 1 <= t)
            merge(rs[p1], rs[p2], s, t, mid + 1, r);
        updata(p1);
    }

    bool query(int p, int s, int t, int l, int r) {
        if (!p)
            return false;

        if (s <= l && r <= t) {
            return val[p];
        }

        bool res = false;
        int mid = (l + r) >> 1;
        if (s <= mid)
            res |= query(ls[p], s, t, l, mid);
        if (mid + 1 <= t)
            res |= query(rs[p], s, t, mid + 1, r);
        return res;
    }
};
 
const int MAXN = 5e5 + 5;

void solve() {
    int n, q;
    cin >> n >> q;

    SegTree tr(n);
    vector<int> root(MAXN);
    tr.build(root[0], 1, n);

    while (q--) {
        int op;
        cin >> op;
        if (op == 1) {
            int l, r, x;
            cin >> l >> r >> x;
            tr.merge(root[x + 1], root[x], l, r, 1, n);
        }
        if (op == 2) {
            int l, r;
            cin >> l >> r;
            int left = 0, right = 5e5 + 1;
            while (left <= right) {
                int mid = (left + right) >> 1;
                if (tr.query(root[mid], l, r, 1, n))
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            cout << right << endl;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 5176kb

input:

5 5
1 3 5 0
1 1 4 1
1 1 5 2
2 2 2
2 4 5

output:

0
3

result:

ok 2 number(s): "0 3"

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 5476kb

input:

1000 1000
2 234 913
1 693 735 47
1 702 959 94
2 273 286
1 814 896 47
1 560 566 15
1 46 699 97
2 494 527
1 721 879 68
1 87 437 26
1 163 938 15
1 816 912 58
2 284 670
2 713 763
1 49 542 13
1 669 874 41
2 795 855
1 601 962 93
1 413 747 50
1 528 710 73
2 255 435
1 329 871 86
1 24 236 48
1 22 48 41
1 29 ...

output:

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
1
0
0
1
0
1
0
0
0
0
0
2
2
0
2
0
0
0
0
2
0
2
2
2
2
2
2
2
2
2
2
0
0
2
0
0
0
3
3
3
0
0
0
1
1
1
3
3
2
2
3
3
1
3
2
3
3
3
3
3
1
3
2
3
3
3
3
3
3
3
3
2
3
3
3
3
2
3
3
3
2
1
3
3
3
1
1
3
2
3
3
1
1
3
3
2
3
3
3
3
3
3
3
2
2
3
3
2
3
1
3
3
2
3
4
4
4
4
2
4
2
4
4
4
...

result:

wrong answer 74th numbers differ - expected: '2', found: '3'