답안 #875790

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
875790 2023-11-20T13:50:20 Z danikoynov Sprinkler (JOI22_sprinkler) C++14
41 / 100
4000 ms 100880 KB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxq = 4e5 + 10;

struct query
{
    int type, ver, d, t;
    ll w;
}ask[maxq];

const int maxn = 2e5 + 10;

int n, q;
ll l, h[maxn];
vector < query > task[maxn];
vector < int > adj[maxn];

bool cmp(query a1, query a2)
{
    return a1.d < a2.d;
}

void input()
{
    cin >> n >> l;
    for (int i = 1; i < n; i ++)
    {
        int v, u;
        cin >> v >> u;
        adj[v].push_back(u);
        adj[u].push_back(v);
    }
    for (int i = 1; i <= n; i ++)
        cin >> h[i];
    cin >> q;
    for (int i = 1; i <= q; i ++)
    {
        cin >> ask[i].type;
        if (ask[i].type == 1)
            cin >> ask[i].ver >> ask[i].d >> ask[i].w;
        else
            cin >> ask[i].ver;
        ask[i].t = i;
    }
}

struct segment_tree
{
    vector < ll > tree, lazy;

    segment_tree(int len = 0)
    {
        tree.resize(4 * (len + 1));
        lazy.resize(4 * (len + 1));
        fill(tree.begin(), tree.end(), 1);
        fill(lazy.begin(), lazy.end(), 1);
    }

    void push_lazy(int root, int left, int right)
    {
        if (lazy[root] == 1)
            return;
        tree[root] *= lazy[root];
        tree[root] %= l;
        if (left != right)
        {
            lazy[root * 2] *= (lazy[root]);
            lazy[root * 2 + 1] *= (lazy[root]);
            lazy[root * 2] %= l;
            lazy[root * 2 + 1] %= l;
        }

        lazy[root] = 1;
    }

    void update_range(int root, int left, int right, int qleft, int qright, ll val)
    {
        push_lazy(root, left, right);
        if (left > qright || right < qleft)
            return;

        if (left >= qleft && right <= qright)
        {
            lazy[root] = val;
            push_lazy(root, left, right);
            return;
        }

        int mid = (left + right) / 2;
        update_range(root * 2, left, mid, qleft, qright, val);
        update_range(root * 2 + 1, mid + 1, right, qleft, qright, val);
    }

    ll get_point(int root, int left, int right, int pos)
    {
        push_lazy(root, left, right);
        if (left == right)
            return tree[root];

        int mid = (left + right) / 2;
        if (pos <= mid)
            return get_point(root * 2, left, mid, pos);
        return get_point(root * 2 + 1, mid + 1, right, pos);
    }
};

segment_tree st[maxn];
int par[maxn], depth[maxn];
vector < int > by_depth[maxn];
int tin[maxn], tout[maxn], timer, rev[maxn];
void dfs(int v)
{
    tin[v] = ++ timer;
    ///cout << "dfs " << v << " "  << depth[v] << endl;
    rev[v] = by_depth[depth[v]].size();
    by_depth[depth[v]].push_back(v);
    for (int u : adj[v])
    {
        if (u == par[v])
            continue;
        par[u] = v;
        depth[u] = depth[v] + 1;
        dfs(u);
    }
    tout[v] = timer;
}

const int maxd = 40;

void update_row(int row, int left, int right, ll val)
{

    int lf = 0, rf = (int)(by_depth[row].size()) - 1;
    while(lf <= rf)
    {
        int mf = (lf + rf) / 2;
        if (tin[by_depth[row][mf]] < left)
            lf = mf + 1;
        else
            rf = mf - 1;
    }

    int lb = lf;

    lf = 0;
    rf = (int)(by_depth[row].size()) - 1;
    while(lf <= rf)
    {
        int mf = (lf + rf) / 2;
        if (tin[by_depth[row][mf]] <= right)
            lf = mf + 1;
        else
            rf = mf - 1;
    }
    int rb = rf;

    st[row].update_range(1, 0, (int)(by_depth[row].size()) - 1, lb, rb, val);

}

void make_query(int v)
{
    ll ans = h[v];
    ans = ans * st[depth[v]].get_point(1, 0, (int)(by_depth[depth[v]].size()) - 1, rev[v]);
    ans %= l;
    cout << ans << endl;
}
void simulate()
{
    for (int i = 1; i <= n; i ++)
        st[i] = segment_tree(by_depth[i].size());
    for (int i = 1; i <= q; i ++)
    {
        if (ask[i].type == 2)
            make_query(ask[i].ver);
        else
        {
            int cnt = 0, ver = ask[i].ver;
            while(ver != 1 && cnt <= ask[i].d)
            {
                int lf = ask[i].d - cnt;
                update_row(depth[ver] + lf, tin[ver], tout[ver], ask[i].w);
                ///cout << "update " << ver << " " << depth[ver] + lf << endl;
                //if (lf != 0)
                update_row(depth[ver] + lf - 1, tin[ver], tout[ver], ask[i].w);
                cnt ++;
                ver = par[ver];
            }
            if (ver == 1 && cnt <= ask[i].d)
            {
                int lf = ask[i].d - cnt;
                for (int j = 0; j <= lf; j ++)
                {
                    ///cout << "update " << ver << " " << depth[ver] + j << endl;
                    update_row(depth[ver] + j, tin[ver], tout[ver], ask[i].w);
                }
            }
/**for (int i = 1; i <= n; i ++)
            cout << h[i] << " ";
        cout << endl;*/
        }

    }

}
void solve()
{
    input();
    ///offline_queries();
    depth[1] = 1;
    dfs(1);
    simulate();
}

int main()
{
    speed();
    solve();
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47964 KB Output is correct
2 Correct 25 ms 47960 KB Output is correct
3 Correct 26 ms 47964 KB Output is correct
4 Correct 35 ms 47956 KB Output is correct
5 Correct 31 ms 47964 KB Output is correct
6 Correct 26 ms 47964 KB Output is correct
7 Correct 27 ms 48060 KB Output is correct
8 Correct 29 ms 48016 KB Output is correct
9 Correct 25 ms 47964 KB Output is correct
10 Correct 26 ms 47996 KB Output is correct
11 Correct 31 ms 48216 KB Output is correct
12 Correct 25 ms 47964 KB Output is correct
13 Correct 25 ms 47984 KB Output is correct
14 Correct 26 ms 47964 KB Output is correct
15 Correct 26 ms 47964 KB Output is correct
16 Correct 25 ms 47792 KB Output is correct
17 Correct 26 ms 47964 KB Output is correct
18 Correct 29 ms 47968 KB Output is correct
19 Correct 25 ms 47804 KB Output is correct
20 Correct 25 ms 47960 KB Output is correct
21 Correct 26 ms 47812 KB Output is correct
22 Correct 25 ms 47952 KB Output is correct
23 Correct 25 ms 47956 KB Output is correct
24 Correct 26 ms 47964 KB Output is correct
25 Correct 25 ms 47960 KB Output is correct
26 Correct 25 ms 47892 KB Output is correct
27 Correct 27 ms 47964 KB Output is correct
28 Correct 26 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 47960 KB Output is correct
2 Correct 309 ms 81212 KB Output is correct
3 Correct 661 ms 77904 KB Output is correct
4 Correct 386 ms 90412 KB Output is correct
5 Correct 513 ms 79956 KB Output is correct
6 Correct 570 ms 79192 KB Output is correct
7 Correct 579 ms 79496 KB Output is correct
8 Correct 444 ms 80068 KB Output is correct
9 Correct 356 ms 97976 KB Output is correct
10 Correct 416 ms 93500 KB Output is correct
11 Correct 408 ms 81052 KB Output is correct
12 Correct 690 ms 78056 KB Output is correct
13 Correct 334 ms 78276 KB Output is correct
14 Correct 551 ms 78284 KB Output is correct
15 Correct 646 ms 78232 KB Output is correct
16 Correct 692 ms 78508 KB Output is correct
17 Correct 851 ms 78688 KB Output is correct
18 Correct 32 ms 47836 KB Output is correct
19 Correct 25 ms 47964 KB Output is correct
20 Correct 26 ms 47964 KB Output is correct
21 Correct 40 ms 47872 KB Output is correct
22 Correct 25 ms 47800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 47960 KB Output is correct
2 Correct 309 ms 81212 KB Output is correct
3 Correct 661 ms 77904 KB Output is correct
4 Correct 386 ms 90412 KB Output is correct
5 Correct 513 ms 79956 KB Output is correct
6 Correct 570 ms 79192 KB Output is correct
7 Correct 579 ms 79496 KB Output is correct
8 Correct 444 ms 80068 KB Output is correct
9 Correct 356 ms 97976 KB Output is correct
10 Correct 416 ms 93500 KB Output is correct
11 Correct 408 ms 81052 KB Output is correct
12 Correct 690 ms 78056 KB Output is correct
13 Correct 334 ms 78276 KB Output is correct
14 Correct 551 ms 78284 KB Output is correct
15 Correct 646 ms 78232 KB Output is correct
16 Correct 692 ms 78508 KB Output is correct
17 Correct 851 ms 78688 KB Output is correct
18 Correct 32 ms 47836 KB Output is correct
19 Correct 25 ms 47964 KB Output is correct
20 Correct 26 ms 47964 KB Output is correct
21 Correct 40 ms 47872 KB Output is correct
22 Correct 25 ms 47800 KB Output is correct
23 Correct 33 ms 47960 KB Output is correct
24 Correct 395 ms 81156 KB Output is correct
25 Correct 1034 ms 77880 KB Output is correct
26 Correct 483 ms 95720 KB Output is correct
27 Correct 646 ms 79436 KB Output is correct
28 Correct 871 ms 79476 KB Output is correct
29 Correct 727 ms 79400 KB Output is correct
30 Correct 452 ms 80032 KB Output is correct
31 Correct 379 ms 92500 KB Output is correct
32 Correct 471 ms 93548 KB Output is correct
33 Correct 369 ms 81176 KB Output is correct
34 Correct 1080 ms 78172 KB Output is correct
35 Correct 25 ms 47976 KB Output is correct
36 Correct 28 ms 47788 KB Output is correct
37 Correct 28 ms 47848 KB Output is correct
38 Correct 26 ms 47808 KB Output is correct
39 Correct 27 ms 47760 KB Output is correct
40 Correct 29 ms 47988 KB Output is correct
41 Correct 25 ms 47960 KB Output is correct
42 Correct 29 ms 47828 KB Output is correct
43 Correct 30 ms 47952 KB Output is correct
44 Correct 26 ms 47944 KB Output is correct
45 Correct 25 ms 47960 KB Output is correct
46 Correct 36 ms 47752 KB Output is correct
47 Correct 26 ms 47964 KB Output is correct
48 Correct 32 ms 47964 KB Output is correct
49 Correct 27 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 47952 KB Output is correct
2 Correct 573 ms 95060 KB Output is correct
3 Correct 1924 ms 89972 KB Output is correct
4 Correct 805 ms 96028 KB Output is correct
5 Correct 3531 ms 83160 KB Output is correct
6 Correct 2673 ms 82652 KB Output is correct
7 Correct 1548 ms 82824 KB Output is correct
8 Correct 330 ms 83000 KB Output is correct
9 Correct 626 ms 94224 KB Output is correct
10 Correct 1889 ms 97964 KB Output is correct
11 Correct 1498 ms 83040 KB Output is correct
12 Execution timed out 4034 ms 82800 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47964 KB Output is correct
2 Correct 608 ms 92160 KB Output is correct
3 Correct 2406 ms 86200 KB Output is correct
4 Correct 839 ms 94304 KB Output is correct
5 Correct 3451 ms 84908 KB Output is correct
6 Correct 2669 ms 84304 KB Output is correct
7 Correct 1832 ms 84152 KB Output is correct
8 Correct 388 ms 84332 KB Output is correct
9 Correct 693 ms 100880 KB Output is correct
10 Correct 2094 ms 98896 KB Output is correct
11 Correct 1922 ms 85216 KB Output is correct
12 Execution timed out 4027 ms 83024 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47964 KB Output is correct
2 Correct 25 ms 47960 KB Output is correct
3 Correct 26 ms 47964 KB Output is correct
4 Correct 35 ms 47956 KB Output is correct
5 Correct 31 ms 47964 KB Output is correct
6 Correct 26 ms 47964 KB Output is correct
7 Correct 27 ms 48060 KB Output is correct
8 Correct 29 ms 48016 KB Output is correct
9 Correct 25 ms 47964 KB Output is correct
10 Correct 26 ms 47996 KB Output is correct
11 Correct 31 ms 48216 KB Output is correct
12 Correct 25 ms 47964 KB Output is correct
13 Correct 25 ms 47984 KB Output is correct
14 Correct 26 ms 47964 KB Output is correct
15 Correct 26 ms 47964 KB Output is correct
16 Correct 25 ms 47792 KB Output is correct
17 Correct 26 ms 47964 KB Output is correct
18 Correct 29 ms 47968 KB Output is correct
19 Correct 25 ms 47804 KB Output is correct
20 Correct 25 ms 47960 KB Output is correct
21 Correct 26 ms 47812 KB Output is correct
22 Correct 25 ms 47952 KB Output is correct
23 Correct 25 ms 47956 KB Output is correct
24 Correct 26 ms 47964 KB Output is correct
25 Correct 25 ms 47960 KB Output is correct
26 Correct 25 ms 47892 KB Output is correct
27 Correct 27 ms 47964 KB Output is correct
28 Correct 26 ms 47964 KB Output is correct
29 Correct 26 ms 47960 KB Output is correct
30 Correct 309 ms 81212 KB Output is correct
31 Correct 661 ms 77904 KB Output is correct
32 Correct 386 ms 90412 KB Output is correct
33 Correct 513 ms 79956 KB Output is correct
34 Correct 570 ms 79192 KB Output is correct
35 Correct 579 ms 79496 KB Output is correct
36 Correct 444 ms 80068 KB Output is correct
37 Correct 356 ms 97976 KB Output is correct
38 Correct 416 ms 93500 KB Output is correct
39 Correct 408 ms 81052 KB Output is correct
40 Correct 690 ms 78056 KB Output is correct
41 Correct 334 ms 78276 KB Output is correct
42 Correct 551 ms 78284 KB Output is correct
43 Correct 646 ms 78232 KB Output is correct
44 Correct 692 ms 78508 KB Output is correct
45 Correct 851 ms 78688 KB Output is correct
46 Correct 32 ms 47836 KB Output is correct
47 Correct 25 ms 47964 KB Output is correct
48 Correct 26 ms 47964 KB Output is correct
49 Correct 40 ms 47872 KB Output is correct
50 Correct 25 ms 47800 KB Output is correct
51 Correct 33 ms 47960 KB Output is correct
52 Correct 395 ms 81156 KB Output is correct
53 Correct 1034 ms 77880 KB Output is correct
54 Correct 483 ms 95720 KB Output is correct
55 Correct 646 ms 79436 KB Output is correct
56 Correct 871 ms 79476 KB Output is correct
57 Correct 727 ms 79400 KB Output is correct
58 Correct 452 ms 80032 KB Output is correct
59 Correct 379 ms 92500 KB Output is correct
60 Correct 471 ms 93548 KB Output is correct
61 Correct 369 ms 81176 KB Output is correct
62 Correct 1080 ms 78172 KB Output is correct
63 Correct 25 ms 47976 KB Output is correct
64 Correct 28 ms 47788 KB Output is correct
65 Correct 28 ms 47848 KB Output is correct
66 Correct 26 ms 47808 KB Output is correct
67 Correct 27 ms 47760 KB Output is correct
68 Correct 29 ms 47988 KB Output is correct
69 Correct 25 ms 47960 KB Output is correct
70 Correct 29 ms 47828 KB Output is correct
71 Correct 30 ms 47952 KB Output is correct
72 Correct 26 ms 47944 KB Output is correct
73 Correct 25 ms 47960 KB Output is correct
74 Correct 36 ms 47752 KB Output is correct
75 Correct 26 ms 47964 KB Output is correct
76 Correct 32 ms 47964 KB Output is correct
77 Correct 27 ms 47964 KB Output is correct
78 Correct 26 ms 47952 KB Output is correct
79 Correct 573 ms 95060 KB Output is correct
80 Correct 1924 ms 89972 KB Output is correct
81 Correct 805 ms 96028 KB Output is correct
82 Correct 3531 ms 83160 KB Output is correct
83 Correct 2673 ms 82652 KB Output is correct
84 Correct 1548 ms 82824 KB Output is correct
85 Correct 330 ms 83000 KB Output is correct
86 Correct 626 ms 94224 KB Output is correct
87 Correct 1889 ms 97964 KB Output is correct
88 Correct 1498 ms 83040 KB Output is correct
89 Execution timed out 4034 ms 82800 KB Time limit exceeded
90 Halted 0 ms 0 KB -