답안 #907479

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
907479 2024-01-15T17:27:30 Z LOLOLO I want to be the very best too! (NOI17_pokemonmaster) C++17
71 / 100
5000 ms 39736 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define           f     first
#define           s     second
#define           pb    push_back
#define           ep    emplace
#define           eb    emplace_back
#define           lb    lower_bound
#define           ub    upper_bound
#define       all(x)    x.begin(), x.end()
#define      rall(x)    x.rbegin(), x.rend()
#define   uniquev(v)    sort(all(v)), (v).resize(unique(all(v)) - (v).begin())
#define     mem(f,x)    memset(f , x , sizeof(f))
#define        sz(x)    (int)(x).size()
#define  __lcm(a, b)    (1ll * ((a) / __gcd((a), (b))) * (b))
#define          mxx    *max_element
#define          mnn    *min_element
#define    cntbit(x)    __builtin_popcountll(x)
#define       len(x)    (int)(x.length())

const int M = 1e5 + 100;
const int N = M;
const int SZ = 1000;
int t[N], x[N], l[N], r[N], n, m, change[M], L[M], P[M], sz[N], y[N], p[N], C[N], ans[N];
vector <pair <int, int>> save[M];

int cov(int a, int b) {
    return (a - 1) * m + b;
}

int get(int a) {
    return p[a] ? get(p[a]) : a;
}

int cc[N];
unordered_map <int, int> mp[N];

void unite(int a, int b) {
    a = get(a), b = get(b);
    if (a == b)
        return;

    if (sz[a] < sz[b])
        swap(a, b);

    sz[a] += sz[b];
    p[b] = a;

    for (auto &x : mp[b]) {
        if (mp[a][x.f] == 0 && x.s)
            cc[a]++;

        mp[a][x.f] += x.s;
    }
}

vector <vector <int>> action;

void upd(int c, int x) {
    c = get(c);

    int &t = mp[c][x];
    if (t == 0)
        cc[c]++;

    action.pb({c, x, t});
    t++;
}

void rollback() {
    while (sz(action)) {
        auto t = action.back();
        action.pop_back();
        if (t[2] == 0) {
            cc[t[0]]--;
        }

        mp[t[0]][t[1]] = t[2];
    }
}

ll solve() {
    mem(L, 0x3f);
    mem(P, 0x3f);

    int q;
    cin >> n >> m >> q;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> L[cov(i, j)];

    vector <vector <int>> edge;

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            if (i < n)
                edge.pb({max(L[cov(i + 1, j)], L[cov(i, j)]), cov(i + 1, j), cov(i, j)});

            if (j < m)
                edge.pb({max(L[cov(i, j + 1)], L[cov(i, j)]), cov(i, j + 1), cov(i, j)});
        }
    }

    sort(all(edge), [&](vector <int> a, vector <int> b) { return a[0] < b[0]; });
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> P[cov(i, j)];

    for (int i = 1; i <= q; i++) {
        cin >> t[i] >> y[i] >> x[i] >> r[i];
    }

    for (int i = 1; i <= q; i += SZ) {
        int X = i, Y = min(q, i + SZ - 1);
        vector <int> ask, up;
        for (int j = X; j <= Y; j++) {
            if (t[j] == 2) {
                ask.pb(j);
            } else {
                up.pb(j);
                change[cov(x[j], y[j])] = 1;
            }
        }

        for (int j = X; j <= Y; j++) {
            if (t[j] == 1) {
                P[cov(x[j], y[j])] = r[j];
            } else {
                save[j - X].clear();
                for (auto t : up) {
                    save[j - X].pb({cov(x[t], y[t]), P[cov(x[t], y[t])]});
                }
            }
        }

        sort(all(ask), [&](int a, int b) { return r[a] < r[b]; });
        for (int j = 1; j <= n * m; j++) {
            mp[j].clear();
            if (change[j] == 0) {
                cc[j] = 1;
                mp[j][P[j]]++;
            } else {
                cc[j] = 0;
            }

            sz[j] = 1;
            p[j] = 0;
        }

        int j = 0;
        for (auto id : ask) {
            while (j < sz(edge) && r[id] >= edge[j][0]) {
                unite(edge[j][1], edge[j][2]);
                j++;
            }

            for (auto t : save[id - X]) {
                upd(t.f, t.s);
            }

            if (r[id] >= L[cov(x[id], y[id])])
                ans[id] = cc[get(cov(x[id], y[id]))];

            rollback();
        }

        for (auto id : up)
            change[cov(x[id], y[id])] = 0;
    }

    for (int i = 1; i <= q; i++) {
        if (t[i] == 2) {
            cout << ans[i] << "\n";
        }
    }

    return 0;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    //cin >> t;

    while (t--) {
        solve();
        //cout << solve() << '\n';
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 23556 KB Output is correct
2 Correct 74 ms 24616 KB Output is correct
3 Correct 66 ms 24388 KB Output is correct
4 Correct 72 ms 24068 KB Output is correct
5 Correct 68 ms 24628 KB Output is correct
6 Correct 58 ms 23872 KB Output is correct
7 Correct 66 ms 24576 KB Output is correct
8 Correct 70 ms 24580 KB Output is correct
9 Correct 71 ms 24624 KB Output is correct
10 Correct 73 ms 25088 KB Output is correct
11 Correct 71 ms 24584 KB Output is correct
12 Correct 75 ms 25344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 60 ms 22576 KB Output is correct
2 Correct 70 ms 22860 KB Output is correct
3 Correct 62 ms 23108 KB Output is correct
4 Correct 82 ms 23932 KB Output is correct
5 Correct 69 ms 24056 KB Output is correct
6 Correct 78 ms 24060 KB Output is correct
7 Correct 104 ms 25508 KB Output is correct
8 Correct 107 ms 26364 KB Output is correct
9 Correct 102 ms 26028 KB Output is correct
10 Correct 117 ms 28156 KB Output is correct
11 Correct 107 ms 26880 KB Output is correct
12 Correct 120 ms 29184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 785 ms 24324 KB Output is correct
2 Correct 2316 ms 31680 KB Output is correct
3 Correct 1635 ms 31500 KB Output is correct
4 Correct 1650 ms 32596 KB Output is correct
5 Correct 2345 ms 32848 KB Output is correct
6 Correct 835 ms 26292 KB Output is correct
7 Correct 3661 ms 34568 KB Output is correct
8 Correct 3587 ms 34436 KB Output is correct
9 Correct 3345 ms 34256 KB Output is correct
10 Correct 3552 ms 34448 KB Output is correct
11 Correct 3544 ms 35384 KB Output is correct
12 Correct 3460 ms 34616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 23556 KB Output is correct
2 Correct 74 ms 24616 KB Output is correct
3 Correct 66 ms 24388 KB Output is correct
4 Correct 72 ms 24068 KB Output is correct
5 Correct 68 ms 24628 KB Output is correct
6 Correct 58 ms 23872 KB Output is correct
7 Correct 66 ms 24576 KB Output is correct
8 Correct 70 ms 24580 KB Output is correct
9 Correct 71 ms 24624 KB Output is correct
10 Correct 73 ms 25088 KB Output is correct
11 Correct 71 ms 24584 KB Output is correct
12 Correct 75 ms 25344 KB Output is correct
13 Correct 808 ms 24288 KB Output is correct
14 Correct 2628 ms 31696 KB Output is correct
15 Correct 2856 ms 31764 KB Output is correct
16 Correct 1884 ms 31448 KB Output is correct
17 Correct 2871 ms 31748 KB Output is correct
18 Correct 1099 ms 24712 KB Output is correct
19 Correct 2432 ms 31604 KB Output is correct
20 Correct 3177 ms 31488 KB Output is correct
21 Correct 2381 ms 31856 KB Output is correct
22 Correct 3303 ms 31752 KB Output is correct
23 Correct 2879 ms 31484 KB Output is correct
24 Correct 3639 ms 32688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 23556 KB Output is correct
2 Correct 74 ms 24616 KB Output is correct
3 Correct 66 ms 24388 KB Output is correct
4 Correct 72 ms 24068 KB Output is correct
5 Correct 68 ms 24628 KB Output is correct
6 Correct 58 ms 23872 KB Output is correct
7 Correct 66 ms 24576 KB Output is correct
8 Correct 70 ms 24580 KB Output is correct
9 Correct 71 ms 24624 KB Output is correct
10 Correct 73 ms 25088 KB Output is correct
11 Correct 71 ms 24584 KB Output is correct
12 Correct 75 ms 25344 KB Output is correct
13 Correct 60 ms 22576 KB Output is correct
14 Correct 70 ms 22860 KB Output is correct
15 Correct 62 ms 23108 KB Output is correct
16 Correct 82 ms 23932 KB Output is correct
17 Correct 69 ms 24056 KB Output is correct
18 Correct 78 ms 24060 KB Output is correct
19 Correct 104 ms 25508 KB Output is correct
20 Correct 107 ms 26364 KB Output is correct
21 Correct 102 ms 26028 KB Output is correct
22 Correct 117 ms 28156 KB Output is correct
23 Correct 107 ms 26880 KB Output is correct
24 Correct 120 ms 29184 KB Output is correct
25 Correct 785 ms 24324 KB Output is correct
26 Correct 2316 ms 31680 KB Output is correct
27 Correct 1635 ms 31500 KB Output is correct
28 Correct 1650 ms 32596 KB Output is correct
29 Correct 2345 ms 32848 KB Output is correct
30 Correct 835 ms 26292 KB Output is correct
31 Correct 3661 ms 34568 KB Output is correct
32 Correct 3587 ms 34436 KB Output is correct
33 Correct 3345 ms 34256 KB Output is correct
34 Correct 3552 ms 34448 KB Output is correct
35 Correct 3544 ms 35384 KB Output is correct
36 Correct 3460 ms 34616 KB Output is correct
37 Correct 808 ms 24288 KB Output is correct
38 Correct 2628 ms 31696 KB Output is correct
39 Correct 2856 ms 31764 KB Output is correct
40 Correct 1884 ms 31448 KB Output is correct
41 Correct 2871 ms 31748 KB Output is correct
42 Correct 1099 ms 24712 KB Output is correct
43 Correct 2432 ms 31604 KB Output is correct
44 Correct 3177 ms 31488 KB Output is correct
45 Correct 2381 ms 31856 KB Output is correct
46 Correct 3303 ms 31752 KB Output is correct
47 Correct 2879 ms 31484 KB Output is correct
48 Correct 3639 ms 32688 KB Output is correct
49 Correct 1035 ms 24300 KB Output is correct
50 Correct 3268 ms 32020 KB Output is correct
51 Correct 2736 ms 31704 KB Output is correct
52 Correct 2307 ms 33748 KB Output is correct
53 Correct 2852 ms 33372 KB Output is correct
54 Correct 1307 ms 25876 KB Output is correct
55 Correct 4263 ms 35080 KB Output is correct
56 Correct 4766 ms 35576 KB Output is correct
57 Correct 4281 ms 37788 KB Output is correct
58 Execution timed out 5073 ms 39736 KB Time limit exceeded
59 Halted 0 ms 0 KB -