답안 #907476

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
907476 2024-01-15T17:22:51 Z LOLOLO I want to be the very best too! (NOI17_pokemonmaster) C++17
51 / 100
5000 ms 29180 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 = 350;
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);

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

    action.pb({c, x, mp[c][x]});
    mp[c][x]++;
}

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 59 ms 22792 KB Output is correct
2 Correct 65 ms 23108 KB Output is correct
3 Correct 64 ms 23364 KB Output is correct
4 Correct 66 ms 23236 KB Output is correct
5 Correct 76 ms 23552 KB Output is correct
6 Correct 63 ms 23044 KB Output is correct
7 Correct 69 ms 23300 KB Output is correct
8 Correct 76 ms 23104 KB Output is correct
9 Correct 72 ms 23300 KB Output is correct
10 Correct 72 ms 23552 KB Output is correct
11 Correct 74 ms 23112 KB Output is correct
12 Correct 76 ms 23856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 64 ms 22788 KB Output is correct
2 Correct 64 ms 22832 KB Output is correct
3 Correct 76 ms 23088 KB Output is correct
4 Correct 75 ms 24372 KB Output is correct
5 Correct 77 ms 24312 KB Output is correct
6 Correct 78 ms 23984 KB Output is correct
7 Correct 119 ms 25340 KB Output is correct
8 Correct 125 ms 26868 KB Output is correct
9 Correct 113 ms 25548 KB Output is correct
10 Correct 135 ms 28368 KB Output is correct
11 Correct 173 ms 27104 KB Output is correct
12 Correct 193 ms 29180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1386 ms 23444 KB Output is correct
2 Correct 1849 ms 23968 KB Output is correct
3 Correct 1939 ms 24684 KB Output is correct
4 Correct 2386 ms 25936 KB Output is correct
5 Correct 2234 ms 25592 KB Output is correct
6 Correct 1246 ms 24440 KB Output is correct
7 Execution timed out 5033 ms 26788 KB Time limit exceeded
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 59 ms 22792 KB Output is correct
2 Correct 65 ms 23108 KB Output is correct
3 Correct 64 ms 23364 KB Output is correct
4 Correct 66 ms 23236 KB Output is correct
5 Correct 76 ms 23552 KB Output is correct
6 Correct 63 ms 23044 KB Output is correct
7 Correct 69 ms 23300 KB Output is correct
8 Correct 76 ms 23104 KB Output is correct
9 Correct 72 ms 23300 KB Output is correct
10 Correct 72 ms 23552 KB Output is correct
11 Correct 74 ms 23112 KB Output is correct
12 Correct 76 ms 23856 KB Output is correct
13 Correct 1099 ms 23360 KB Output is correct
14 Correct 2293 ms 23900 KB Output is correct
15 Correct 2485 ms 24856 KB Output is correct
16 Correct 2234 ms 24600 KB Output is correct
17 Correct 2382 ms 23900 KB Output is correct
18 Correct 1423 ms 23868 KB Output is correct
19 Correct 2064 ms 23880 KB Output is correct
20 Correct 2236 ms 23900 KB Output is correct
21 Correct 2049 ms 24084 KB Output is correct
22 Correct 2549 ms 24144 KB Output is correct
23 Correct 2280 ms 23908 KB Output is correct
24 Correct 3331 ms 24620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 59 ms 22792 KB Output is correct
2 Correct 65 ms 23108 KB Output is correct
3 Correct 64 ms 23364 KB Output is correct
4 Correct 66 ms 23236 KB Output is correct
5 Correct 76 ms 23552 KB Output is correct
6 Correct 63 ms 23044 KB Output is correct
7 Correct 69 ms 23300 KB Output is correct
8 Correct 76 ms 23104 KB Output is correct
9 Correct 72 ms 23300 KB Output is correct
10 Correct 72 ms 23552 KB Output is correct
11 Correct 74 ms 23112 KB Output is correct
12 Correct 76 ms 23856 KB Output is correct
13 Correct 64 ms 22788 KB Output is correct
14 Correct 64 ms 22832 KB Output is correct
15 Correct 76 ms 23088 KB Output is correct
16 Correct 75 ms 24372 KB Output is correct
17 Correct 77 ms 24312 KB Output is correct
18 Correct 78 ms 23984 KB Output is correct
19 Correct 119 ms 25340 KB Output is correct
20 Correct 125 ms 26868 KB Output is correct
21 Correct 113 ms 25548 KB Output is correct
22 Correct 135 ms 28368 KB Output is correct
23 Correct 173 ms 27104 KB Output is correct
24 Correct 193 ms 29180 KB Output is correct
25 Correct 1386 ms 23444 KB Output is correct
26 Correct 1849 ms 23968 KB Output is correct
27 Correct 1939 ms 24684 KB Output is correct
28 Correct 2386 ms 25936 KB Output is correct
29 Correct 2234 ms 25592 KB Output is correct
30 Correct 1246 ms 24440 KB Output is correct
31 Execution timed out 5033 ms 26788 KB Time limit exceeded
32 Halted 0 ms 0 KB -