QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#780004#7105. Pixel ArtrgnerdplayerAC ✓340ms14196kbC++232.5kb2024-11-24 23:27:542024-11-24 23:28:19

Judging History

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

  • [2024-11-24 23:28:19]
  • 评测
  • 测评结果:AC
  • 用时:340ms
  • 内存:14196kb
  • [2024-11-24 23:27:54]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

using i64 = long long;

struct DSU {
    int n, cnt;
    vector<int> fa, sz;
    DSU(int n = 0) : n(n), cnt(n), fa(n), sz(n, 1) { iota(fa.begin(), fa.end(), 0); }
    int find(int u) { return u == fa[u] ? u : fa[u] = find(fa[u]); }
    bool join(int u, int v) {
        u = find(u), v = find(v);
        if (u != v) {
            // if (sz[u] < sz[v]) { swap(u, v); }
            sz[u] += sz[v];
            fa[v] = u;
            cnt--;
            return true;
        }
        return false;
    }
    bool same(int u, int v) { return find(u) == find(v); }
    int size(int u) { return sz[find(u)]; }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    int t;
    cin >> t;

    auto solve = [&]() {
        int n, m, k;
        cin >> n >> m >> k;

        vector<int> r1(k), c1(k), r2(k), c2(k);
        vector<vector<int>> add(n), del(n + 1);
        for (int i = 0; i < k; i++) {
            cin >> r1[i] >> c1[i] >> r2[i] >> c2[i];
            r1[i]--, c1[i]--;
            add[r1[i]].push_back(i);
            del[r2[i]].push_back(i);
        }

        DSU dsu(k);

        i64 black = 0;
        int in = 0;
        set<array<int, 3>> s;
        int cnt = 0;

        for (int x = 0; x < n; x++) {
            for (auto i : add[x]) {
                auto it = s.lower_bound({c1[i], 0, 0});
                if (it != s.begin()) {
                    it--;
                }
                while (it != s.end() && it->at(0) < c2[i]) {
                    if (it->at(1) > c1[i]) {
                        dsu.join(i, it->at(2));
                    }
                    it++;
                }
            }
            for (auto i : del[x]) {
                cnt -= c2[i] - c1[i];
                s.erase({c1[i], c2[i], i});
            }
            for (auto i : add[x]) {
                auto it = s.insert({c1[i], c2[i], i}).first;
                if (it != s.begin() && prev(it)->at(1) == c1[i]) {
                    dsu.join(i, prev(it)->at(2));
                }
                if (next(it) != s.end() && next(it)->at(0) == c2[i]) {
                    dsu.join(i, next(it)->at(2));
                }
                cnt += c2[i] - c1[i];
                in++;
            }
            black += cnt;
            int comps = in - k + dsu.cnt;
            cout << black << ' ' << comps << '\n';
        }
    };

    while (t--) {
        solve();
    }
    
    return 0;
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

3
2 5 2
1 1 1 2
2 3 2 5
2 5 2
1 1 1 3
2 3 2 5
3 3 3
1 1 1 2
3 1 3 2
1 3 2 3

output:

2 1
5 2
3 1
6 1
3 1
4 1
6 2

result:

ok 7 lines

Test #2:

score: 0
Accepted
time: 340ms
memory: 14196kb

input:

2130
2 5 2
1 1 1 2
2 3 2 5
2 5 2
1 1 1 3
2 3 2 5
3 3 3
1 1 1 2
3 1 3 2
1 3 2 3
3 100 51
1 2 2 2
1 4 2 4
1 6 2 6
1 8 2 8
1 10 2 10
1 12 2 12
1 14 2 14
1 16 2 16
1 18 2 18
1 20 2 20
1 22 2 22
1 24 2 24
1 26 2 26
1 28 2 28
1 30 2 30
1 32 2 32
1 34 2 34
1 36 2 36
1 38 2 38
1 40 2 40
1 42 2 42
1 44 2 44
...

output:

2 1
5 2
3 1
6 1
3 1
4 1
6 2
50 50
100 50
200 1
50 50
150 1
200 1
2 1
4 1
6 1
8 1
10 1
12 1
14 1
16 1
18 1
20 1
22 1
24 1
26 1
28 1
30 1
32 1
34 1
36 1
38 1
40 1
42 1
44 1
46 1
48 1
50 1
52 1
54 1
56 1
58 1
60 1
62 1
64 1
66 1
68 1
70 1
72 1
74 1
76 1
78 1
80 1
82 1
84 1
86 1
88 1
90 1
92 1
94 1
96 1...

result:

ok 355756 lines

Extra Test:

score: 0
Extra Test Passed