답안 #850802

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
850802 2023-09-17T13:12:39 Z EJIC_B_KEDAX Sprinkler (JOI22_sprinkler) C++14
41 / 100
4000 ms 145028 KB
#include <bits/stdc++.h>
#include <random>

#ifndef LOCAL
//    #pragma GCC optimize("O3")
//    #pragma GCC optimize("Ofast")
//    #pragma GCC optimize("unroll-loops")
//    #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
#endif
using namespace std;
typedef long long ll;
typedef double dd;
typedef long double ld;
typedef unsigned int uii;
#define x first
#define y second
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()



void solve();

mt19937_64 mt(1);

int32_t main() {
#ifdef LOCAL
    freopen("input.in", "r", stdin);
    freopen("output.out", "w", stdout);
#else
    ios::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    //freopen("amusing.in", "r", stdin);
    //freopen("amusing.out", "w", stdout);
#endif
    cout << fixed << setprecision(30);
    int tests = 1;
    //cin >> tests;
    while (tests--) {
        solve();
    }
}

ll mod;

class SegmentTree {
public:
    void build(const vector<int>& b) {
        int sz = 1;
        while (sz < b.size()) {
            sz *= 2;
        }
        x.resize(2 * sz - 1);
        vn.resize(2 * sz - 1, 1);
        size = 2 * sz - 1;
        for (int i = sz - 1; i < 2 * sz - 1; i++) {
            if (i - sz + 1 < b.size()) {
                x[i] = b[i - sz + 1];
            } else {
                x[i] = 0;
            }
        }
        for (int i = sz - 2; i >= 0; i--) {
            //update(i);
            x[i] = 0;
        }
    }

    int get(int l, int r, int i = 0, int lx = 0, int rx = -1) {
        if (rx == -1) {
            rx = size / 2;
        }
        if (lx > r || rx < l) {
            return 0;
        }

        if (lx >= l && rx <= r) {
            return x[i];
        }

        updateVN(i);
        return get(l, r, 2 * i + 1, lx, (rx + lx) / 2) + get(l, r, 2 * i + 2, (rx + lx) / 2 + 1, rx);
    }

    void change(int ind, int c, int i = 0, int lx = 0, int rx = -1) {
        if (rx == -1) {
            rx = size / 2;
        }
        if (lx == rx) {
            x[i] = c;
            return;
        }
        updateVN(i);
        if ((rx + lx) / 2 >= ind) {
            change(ind, c, 2 * i + 1, lx, (rx + lx) / 2);
        } else {
            change(ind, c, 2 * i + 2, (rx + lx) / 2 + 1, rx);
        }
        //update(i);
    }
    void plusOtr(int l, int r, ll p, int i = 0, int lx = 0, int rx = -1) {
        if (r < l) {
            return;
        }
        if (rx == -1) {
            rx = size / 2;
        }
        if (lx >= l && rx <= r) {
            x[i] = (x[i] * p) % mod;
            vn[i] = (vn[i] * p) % mod;
            return;
        }
        if (lx > r || rx < l) {
            return;
        }
        updateVN(i);
        plusOtr(l, r, p, 2 * i + 1, lx, (rx + lx) / 2);
        plusOtr(l, r, p, 2 * i + 2, (rx + lx) / 2 + 1, rx);
        //update(i);
    }
private:
    vector<ll> x, vn;
    int size;
    void updateVN(int i) {
        if (2 * i + 2 < size) {
            if (vn[i] != 1) {
                if (x[2 * i + 1]) {
                    x[2 * i + 1] = (x[2 * i + 1] * vn[i]) % mod;
                }
                vn[2 * i + 1] = (vn[2 * i + 1] * vn[i]) % mod;
                if (x[2 * i + 2]) {
                    x[2 * i + 2] = (x[2 * i + 2] * vn[i]) % mod;
                }
                vn[2 * i + 2] = (vn[2 * i + 2] * vn[i]) % mod;
                vn[i] = 1;
            }
        }
    }
    void update(int i) {
        if (2 * i + 2 < size) {
            x[i] = x[2 * i + 1] + x[2 * i + 2];
        }
    }
};

void dfs(int s, int p, vector<vector<int>>& g, vector<int>& dist, vector<vector<int>>& d, vector<vector<pair<int, int>>>& seg, vector<int>& pr) {
    if (p != -1) {
        dist[s] = dist[p] + 1;
    } else {
        dist[s] = 0;
    }
    pr[s] = p;
    d[dist[s]].push_back(s);
    seg[s][0] = {d[dist[s]].size() - 1, d[dist[s]].size() - 1};
    for (int i = 1; i < 41; i++) {
        seg[s][i] = {INT32_MAX, INT32_MIN};
    }
    bool f = true;
    for (int i : g[s]) {
        if (i != p) {
            dfs(i, s, g, dist, d, seg, pr);
            for (int j = 1; j < 41; j++) {
                seg[s][j].x = min(seg[s][j].x, seg[i][j - 1].x);
            }
            for (int j = 1; j < 41; j++) {
                seg[s][j].y = max(seg[s][j].y, seg[i][j - 1].y);
            }
        }
    }
}

void solve() {
    int n;
    cin >> n >> mod;
    vector<vector<int>> g(n), d(n);
    vector<int> deg(n, 0), dist(n), h(n), p(n);
    vector<vector<pair<int, int>>> seg(n, vector<pair<int, int>>(41, {INT32_MAX, INT32_MIN}));
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        cin >> u >> v; u--; v--;
        g[u].push_back(v);
        g[v].push_back(u);
        deg[u]++;
        deg[v]++;
    }
    int root = 0;
    for (int i = 0; i < n; i++) {
        if (deg[i] == 1) {
            root = i;
            break;
        }
    }
    dfs(root, -1, g, dist, d, seg, p);
    for (int i = 0; i < n; i++) {
        cin >> h[i];
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < d[i].size(); j++) {
            d[i][j] = h[d[i][j]];
        }
    }
    vector<SegmentTree> dec(n);
    for (int i = 0; i < n; i++) {
        dec[i].build(d[i]);
    }
    int q;
    cin >> q;
    while (q--) {
        int t;
        cin >> t;
        if (t == 1) {
            int x, dk, wk;
            cin >> x >> dk >> wk; x--;
            int nw = x, lev = 0, nlev = 0;
            for (int l = -dk; l <= dk; l++) {
                if (dist[x] - l < 0) {
                    break;
                }
                if (dist[x] - l >= n) {
                    continue;
                }
                int c = (dk + l) / 2;
                while (c > nlev) {
                    nlev++;
                    if (p[nw] != -1) {
                        lev++;
                        nw = p[nw];
                    }
                }
                if (c - l >= 0 && c - l <= dk) {
                    int l1, r1;
                    l1 = seg[nw][lev - l].x;
                    r1 = seg[nw][lev - l].y;
                    dec[dist[x] - l].plusOtr(l1, r1, wk);
                }
            }
        } else {
            int x;
            cin >> x; x--;
            cout << (dec[dist[x]].get(seg[x][0].x, seg[x][0].y) % mod + mod) % mod << '\n';
        }
    }
}

Compilation message

sprinkler.cpp: In member function 'void SegmentTree::build(const std::vector<int>&)':
sprinkler.cpp:50:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |         while (sz < b.size()) {
      |                ~~~^~~~~~~~~~
sprinkler.cpp:57:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |             if (i - sz + 1 < b.size()) {
      |                 ~~~~~~~~~~~^~~~~~~~~~
sprinkler.cpp: In function 'void dfs(int, int, std::vector<std::vector<int> >&, std::vector<int>&, std::vector<std::vector<int> >&, std::vector<std::vector<std::pair<int, int> > >&, std::vector<int>&)':
sprinkler.cpp:158:10: warning: unused variable 'f' [-Wunused-variable]
  158 |     bool f = true;
      |          ^
sprinkler.cpp: In function 'void solve()':
sprinkler.cpp:198:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  198 |         for (int j = 0; j < d[i].size(); j++) {
      |                         ~~^~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 2 ms 1116 KB Output is correct
5 Correct 3 ms 856 KB Output is correct
6 Correct 2 ms 856 KB Output is correct
7 Correct 2 ms 856 KB Output is correct
8 Correct 1 ms 856 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 1 ms 344 KB Output is correct
12 Correct 1 ms 344 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 0 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 1 ms 344 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 1 ms 344 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 344 KB Output is correct
24 Correct 0 ms 344 KB Output is correct
25 Correct 1 ms 344 KB Output is correct
26 Correct 1 ms 344 KB Output is correct
27 Correct 1 ms 344 KB Output is correct
28 Correct 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 476 ms 126880 KB Output is correct
3 Correct 703 ms 123904 KB Output is correct
4 Correct 591 ms 143156 KB Output is correct
5 Correct 548 ms 125264 KB Output is correct
6 Correct 540 ms 125592 KB Output is correct
7 Correct 519 ms 124876 KB Output is correct
8 Correct 450 ms 124768 KB Output is correct
9 Correct 525 ms 144928 KB Output is correct
10 Correct 603 ms 141680 KB Output is correct
11 Correct 485 ms 126824 KB Output is correct
12 Correct 632 ms 124264 KB Output is correct
13 Correct 422 ms 124620 KB Output is correct
14 Correct 501 ms 125596 KB Output is correct
15 Correct 518 ms 124364 KB Output is correct
16 Correct 552 ms 124492 KB Output is correct
17 Correct 604 ms 123960 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 0 ms 344 KB Output is correct
21 Correct 1 ms 344 KB Output is correct
22 Correct 1 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 476 ms 126880 KB Output is correct
3 Correct 703 ms 123904 KB Output is correct
4 Correct 591 ms 143156 KB Output is correct
5 Correct 548 ms 125264 KB Output is correct
6 Correct 540 ms 125592 KB Output is correct
7 Correct 519 ms 124876 KB Output is correct
8 Correct 450 ms 124768 KB Output is correct
9 Correct 525 ms 144928 KB Output is correct
10 Correct 603 ms 141680 KB Output is correct
11 Correct 485 ms 126824 KB Output is correct
12 Correct 632 ms 124264 KB Output is correct
13 Correct 422 ms 124620 KB Output is correct
14 Correct 501 ms 125596 KB Output is correct
15 Correct 518 ms 124364 KB Output is correct
16 Correct 552 ms 124492 KB Output is correct
17 Correct 604 ms 123960 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 0 ms 344 KB Output is correct
21 Correct 1 ms 344 KB Output is correct
22 Correct 1 ms 344 KB Output is correct
23 Correct 1 ms 344 KB Output is correct
24 Correct 498 ms 126960 KB Output is correct
25 Correct 765 ms 124284 KB Output is correct
26 Correct 557 ms 143184 KB Output is correct
27 Correct 556 ms 125268 KB Output is correct
28 Correct 576 ms 125520 KB Output is correct
29 Correct 584 ms 126024 KB Output is correct
30 Correct 489 ms 124740 KB Output is correct
31 Correct 532 ms 144860 KB Output is correct
32 Correct 701 ms 141888 KB Output is correct
33 Correct 531 ms 126996 KB Output is correct
34 Correct 732 ms 123628 KB Output is correct
35 Correct 1 ms 344 KB Output is correct
36 Correct 1 ms 344 KB Output is correct
37 Correct 0 ms 344 KB Output is correct
38 Correct 0 ms 344 KB Output is correct
39 Correct 1 ms 344 KB Output is correct
40 Correct 0 ms 348 KB Output is correct
41 Correct 1 ms 344 KB Output is correct
42 Correct 0 ms 344 KB Output is correct
43 Correct 0 ms 344 KB Output is correct
44 Correct 0 ms 344 KB Output is correct
45 Correct 0 ms 344 KB Output is correct
46 Correct 0 ms 344 KB Output is correct
47 Correct 0 ms 344 KB Output is correct
48 Correct 0 ms 344 KB Output is correct
49 Correct 0 ms 344 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 905 ms 142144 KB Output is correct
3 Correct 3636 ms 141828 KB Output is correct
4 Correct 1384 ms 141792 KB Output is correct
5 Correct 2033 ms 123992 KB Output is correct
6 Correct 1569 ms 124220 KB Output is correct
7 Correct 1097 ms 124396 KB Output is correct
8 Correct 486 ms 123512 KB Output is correct
9 Correct 868 ms 142200 KB Output is correct
10 Correct 3751 ms 141452 KB Output is correct
11 Correct 1099 ms 124532 KB Output is correct
12 Execution timed out 4051 ms 123892 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 352 KB Output is correct
2 Correct 887 ms 144940 KB Output is correct
3 Correct 3741 ms 141784 KB Output is correct
4 Correct 1495 ms 143484 KB Output is correct
5 Correct 1923 ms 125736 KB Output is correct
6 Correct 1668 ms 125580 KB Output is correct
7 Correct 1117 ms 124620 KB Output is correct
8 Correct 509 ms 124736 KB Output is correct
9 Correct 878 ms 145028 KB Output is correct
10 Correct 3621 ms 141744 KB Output is correct
11 Correct 1071 ms 134520 KB Output is correct
12 Execution timed out 4086 ms 131852 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 2 ms 1116 KB Output is correct
5 Correct 3 ms 856 KB Output is correct
6 Correct 2 ms 856 KB Output is correct
7 Correct 2 ms 856 KB Output is correct
8 Correct 1 ms 856 KB Output is correct
9 Correct 0 ms 344 KB Output is correct
10 Correct 0 ms 344 KB Output is correct
11 Correct 1 ms 344 KB Output is correct
12 Correct 1 ms 344 KB Output is correct
13 Correct 1 ms 344 KB Output is correct
14 Correct 1 ms 344 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 0 ms 344 KB Output is correct
17 Correct 1 ms 344 KB Output is correct
18 Correct 1 ms 344 KB Output is correct
19 Correct 1 ms 344 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 1 ms 344 KB Output is correct
22 Correct 1 ms 348 KB Output is correct
23 Correct 1 ms 344 KB Output is correct
24 Correct 0 ms 344 KB Output is correct
25 Correct 1 ms 344 KB Output is correct
26 Correct 1 ms 344 KB Output is correct
27 Correct 1 ms 344 KB Output is correct
28 Correct 1 ms 344 KB Output is correct
29 Correct 1 ms 344 KB Output is correct
30 Correct 476 ms 126880 KB Output is correct
31 Correct 703 ms 123904 KB Output is correct
32 Correct 591 ms 143156 KB Output is correct
33 Correct 548 ms 125264 KB Output is correct
34 Correct 540 ms 125592 KB Output is correct
35 Correct 519 ms 124876 KB Output is correct
36 Correct 450 ms 124768 KB Output is correct
37 Correct 525 ms 144928 KB Output is correct
38 Correct 603 ms 141680 KB Output is correct
39 Correct 485 ms 126824 KB Output is correct
40 Correct 632 ms 124264 KB Output is correct
41 Correct 422 ms 124620 KB Output is correct
42 Correct 501 ms 125596 KB Output is correct
43 Correct 518 ms 124364 KB Output is correct
44 Correct 552 ms 124492 KB Output is correct
45 Correct 604 ms 123960 KB Output is correct
46 Correct 1 ms 344 KB Output is correct
47 Correct 0 ms 344 KB Output is correct
48 Correct 0 ms 344 KB Output is correct
49 Correct 1 ms 344 KB Output is correct
50 Correct 1 ms 344 KB Output is correct
51 Correct 1 ms 344 KB Output is correct
52 Correct 498 ms 126960 KB Output is correct
53 Correct 765 ms 124284 KB Output is correct
54 Correct 557 ms 143184 KB Output is correct
55 Correct 556 ms 125268 KB Output is correct
56 Correct 576 ms 125520 KB Output is correct
57 Correct 584 ms 126024 KB Output is correct
58 Correct 489 ms 124740 KB Output is correct
59 Correct 532 ms 144860 KB Output is correct
60 Correct 701 ms 141888 KB Output is correct
61 Correct 531 ms 126996 KB Output is correct
62 Correct 732 ms 123628 KB Output is correct
63 Correct 1 ms 344 KB Output is correct
64 Correct 1 ms 344 KB Output is correct
65 Correct 0 ms 344 KB Output is correct
66 Correct 0 ms 344 KB Output is correct
67 Correct 1 ms 344 KB Output is correct
68 Correct 0 ms 348 KB Output is correct
69 Correct 1 ms 344 KB Output is correct
70 Correct 0 ms 344 KB Output is correct
71 Correct 0 ms 344 KB Output is correct
72 Correct 0 ms 344 KB Output is correct
73 Correct 0 ms 344 KB Output is correct
74 Correct 0 ms 344 KB Output is correct
75 Correct 0 ms 344 KB Output is correct
76 Correct 0 ms 344 KB Output is correct
77 Correct 0 ms 344 KB Output is correct
78 Correct 0 ms 344 KB Output is correct
79 Correct 905 ms 142144 KB Output is correct
80 Correct 3636 ms 141828 KB Output is correct
81 Correct 1384 ms 141792 KB Output is correct
82 Correct 2033 ms 123992 KB Output is correct
83 Correct 1569 ms 124220 KB Output is correct
84 Correct 1097 ms 124396 KB Output is correct
85 Correct 486 ms 123512 KB Output is correct
86 Correct 868 ms 142200 KB Output is correct
87 Correct 3751 ms 141452 KB Output is correct
88 Correct 1099 ms 124532 KB Output is correct
89 Execution timed out 4051 ms 123892 KB Time limit exceeded
90 Halted 0 ms 0 KB -