답안 #875792

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
875792 2023-11-20T13:52:28 Z danikoynov Sprinkler (JOI22_sprinkler) C++14
41 / 100
4000 ms 98300 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 34 ms 47964 KB Output is correct
2 Correct 24 ms 47944 KB Output is correct
3 Correct 24 ms 47960 KB Output is correct
4 Correct 26 ms 47964 KB Output is correct
5 Correct 27 ms 47960 KB Output is correct
6 Correct 25 ms 47960 KB Output is correct
7 Correct 37 ms 47964 KB Output is correct
8 Correct 29 ms 47964 KB Output is correct
9 Correct 25 ms 47964 KB Output is correct
10 Correct 25 ms 47964 KB Output is correct
11 Correct 25 ms 47964 KB Output is correct
12 Correct 26 ms 47912 KB Output is correct
13 Correct 25 ms 47864 KB Output is correct
14 Correct 32 ms 47908 KB Output is correct
15 Correct 25 ms 47960 KB Output is correct
16 Correct 26 ms 47924 KB Output is correct
17 Correct 25 ms 47964 KB Output is correct
18 Correct 25 ms 47964 KB Output is correct
19 Correct 24 ms 47936 KB Output is correct
20 Correct 25 ms 47964 KB Output is correct
21 Correct 37 ms 47964 KB Output is correct
22 Correct 36 ms 47964 KB Output is correct
23 Correct 26 ms 47960 KB Output is correct
24 Correct 24 ms 47984 KB Output is correct
25 Correct 24 ms 47980 KB Output is correct
26 Correct 28 ms 47884 KB Output is correct
27 Correct 24 ms 47960 KB Output is correct
28 Correct 37 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 354 ms 81252 KB Output is correct
3 Correct 761 ms 78164 KB Output is correct
4 Correct 386 ms 90448 KB Output is correct
5 Correct 499 ms 79536 KB Output is correct
6 Correct 559 ms 79588 KB Output is correct
7 Correct 576 ms 79468 KB Output is correct
8 Correct 353 ms 79944 KB Output is correct
9 Correct 369 ms 98300 KB Output is correct
10 Correct 416 ms 93516 KB Output is correct
11 Correct 326 ms 81340 KB Output is correct
12 Correct 636 ms 78100 KB Output is correct
13 Correct 288 ms 78344 KB Output is correct
14 Correct 577 ms 78280 KB Output is correct
15 Correct 590 ms 78540 KB Output is correct
16 Correct 610 ms 78156 KB Output is correct
17 Correct 769 ms 78780 KB Output is correct
18 Correct 24 ms 48216 KB Output is correct
19 Correct 24 ms 48248 KB Output is correct
20 Correct 25 ms 48172 KB Output is correct
21 Correct 25 ms 47964 KB Output is correct
22 Correct 25 ms 47752 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 354 ms 81252 KB Output is correct
3 Correct 761 ms 78164 KB Output is correct
4 Correct 386 ms 90448 KB Output is correct
5 Correct 499 ms 79536 KB Output is correct
6 Correct 559 ms 79588 KB Output is correct
7 Correct 576 ms 79468 KB Output is correct
8 Correct 353 ms 79944 KB Output is correct
9 Correct 369 ms 98300 KB Output is correct
10 Correct 416 ms 93516 KB Output is correct
11 Correct 326 ms 81340 KB Output is correct
12 Correct 636 ms 78100 KB Output is correct
13 Correct 288 ms 78344 KB Output is correct
14 Correct 577 ms 78280 KB Output is correct
15 Correct 590 ms 78540 KB Output is correct
16 Correct 610 ms 78156 KB Output is correct
17 Correct 769 ms 78780 KB Output is correct
18 Correct 24 ms 48216 KB Output is correct
19 Correct 24 ms 48248 KB Output is correct
20 Correct 25 ms 48172 KB Output is correct
21 Correct 25 ms 47964 KB Output is correct
22 Correct 25 ms 47752 KB Output is correct
23 Correct 25 ms 47964 KB Output is correct
24 Correct 324 ms 80980 KB Output is correct
25 Correct 917 ms 78148 KB Output is correct
26 Correct 408 ms 95852 KB Output is correct
27 Correct 500 ms 79696 KB Output is correct
28 Correct 649 ms 79468 KB Output is correct
29 Correct 676 ms 79436 KB Output is correct
30 Correct 420 ms 80012 KB Output is correct
31 Correct 341 ms 92616 KB Output is correct
32 Correct 459 ms 93524 KB Output is correct
33 Correct 356 ms 81184 KB Output is correct
34 Correct 908 ms 78196 KB Output is correct
35 Correct 25 ms 47964 KB Output is correct
36 Correct 24 ms 47996 KB Output is correct
37 Correct 25 ms 47960 KB Output is correct
38 Correct 33 ms 47996 KB Output is correct
39 Correct 24 ms 47960 KB Output is correct
40 Correct 24 ms 47964 KB Output is correct
41 Correct 25 ms 47968 KB Output is correct
42 Correct 27 ms 47960 KB Output is correct
43 Correct 24 ms 47964 KB Output is correct
44 Correct 26 ms 47964 KB Output is correct
45 Correct 24 ms 48160 KB Output is correct
46 Correct 24 ms 47964 KB Output is correct
47 Correct 25 ms 47960 KB Output is correct
48 Correct 24 ms 47964 KB Output is correct
49 Correct 24 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 47952 KB Output is correct
2 Correct 553 ms 95012 KB Output is correct
3 Correct 1855 ms 90280 KB Output is correct
4 Correct 802 ms 91196 KB Output is correct
5 Correct 3027 ms 78036 KB Output is correct
6 Correct 2491 ms 77756 KB Output is correct
7 Correct 1255 ms 77900 KB Output is correct
8 Correct 288 ms 78492 KB Output is correct
9 Correct 506 ms 89936 KB Output is correct
10 Correct 1547 ms 93152 KB Output is correct
11 Correct 1276 ms 78348 KB Output is correct
12 Execution timed out 4061 ms 77688 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 511 ms 91740 KB Output is correct
3 Correct 1992 ms 86100 KB Output is correct
4 Correct 859 ms 89428 KB Output is correct
5 Correct 3024 ms 79868 KB Output is correct
6 Correct 2654 ms 79824 KB Output is correct
7 Correct 1571 ms 79304 KB Output is correct
8 Correct 335 ms 79620 KB Output is correct
9 Correct 552 ms 96792 KB Output is correct
10 Correct 1667 ms 94076 KB Output is correct
11 Correct 1262 ms 80948 KB Output is correct
12 Execution timed out 4056 ms 78044 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 47964 KB Output is correct
2 Correct 24 ms 47944 KB Output is correct
3 Correct 24 ms 47960 KB Output is correct
4 Correct 26 ms 47964 KB Output is correct
5 Correct 27 ms 47960 KB Output is correct
6 Correct 25 ms 47960 KB Output is correct
7 Correct 37 ms 47964 KB Output is correct
8 Correct 29 ms 47964 KB Output is correct
9 Correct 25 ms 47964 KB Output is correct
10 Correct 25 ms 47964 KB Output is correct
11 Correct 25 ms 47964 KB Output is correct
12 Correct 26 ms 47912 KB Output is correct
13 Correct 25 ms 47864 KB Output is correct
14 Correct 32 ms 47908 KB Output is correct
15 Correct 25 ms 47960 KB Output is correct
16 Correct 26 ms 47924 KB Output is correct
17 Correct 25 ms 47964 KB Output is correct
18 Correct 25 ms 47964 KB Output is correct
19 Correct 24 ms 47936 KB Output is correct
20 Correct 25 ms 47964 KB Output is correct
21 Correct 37 ms 47964 KB Output is correct
22 Correct 36 ms 47964 KB Output is correct
23 Correct 26 ms 47960 KB Output is correct
24 Correct 24 ms 47984 KB Output is correct
25 Correct 24 ms 47980 KB Output is correct
26 Correct 28 ms 47884 KB Output is correct
27 Correct 24 ms 47960 KB Output is correct
28 Correct 37 ms 47964 KB Output is correct
29 Correct 24 ms 47964 KB Output is correct
30 Correct 354 ms 81252 KB Output is correct
31 Correct 761 ms 78164 KB Output is correct
32 Correct 386 ms 90448 KB Output is correct
33 Correct 499 ms 79536 KB Output is correct
34 Correct 559 ms 79588 KB Output is correct
35 Correct 576 ms 79468 KB Output is correct
36 Correct 353 ms 79944 KB Output is correct
37 Correct 369 ms 98300 KB Output is correct
38 Correct 416 ms 93516 KB Output is correct
39 Correct 326 ms 81340 KB Output is correct
40 Correct 636 ms 78100 KB Output is correct
41 Correct 288 ms 78344 KB Output is correct
42 Correct 577 ms 78280 KB Output is correct
43 Correct 590 ms 78540 KB Output is correct
44 Correct 610 ms 78156 KB Output is correct
45 Correct 769 ms 78780 KB Output is correct
46 Correct 24 ms 48216 KB Output is correct
47 Correct 24 ms 48248 KB Output is correct
48 Correct 25 ms 48172 KB Output is correct
49 Correct 25 ms 47964 KB Output is correct
50 Correct 25 ms 47752 KB Output is correct
51 Correct 25 ms 47964 KB Output is correct
52 Correct 324 ms 80980 KB Output is correct
53 Correct 917 ms 78148 KB Output is correct
54 Correct 408 ms 95852 KB Output is correct
55 Correct 500 ms 79696 KB Output is correct
56 Correct 649 ms 79468 KB Output is correct
57 Correct 676 ms 79436 KB Output is correct
58 Correct 420 ms 80012 KB Output is correct
59 Correct 341 ms 92616 KB Output is correct
60 Correct 459 ms 93524 KB Output is correct
61 Correct 356 ms 81184 KB Output is correct
62 Correct 908 ms 78196 KB Output is correct
63 Correct 25 ms 47964 KB Output is correct
64 Correct 24 ms 47996 KB Output is correct
65 Correct 25 ms 47960 KB Output is correct
66 Correct 33 ms 47996 KB Output is correct
67 Correct 24 ms 47960 KB Output is correct
68 Correct 24 ms 47964 KB Output is correct
69 Correct 25 ms 47968 KB Output is correct
70 Correct 27 ms 47960 KB Output is correct
71 Correct 24 ms 47964 KB Output is correct
72 Correct 26 ms 47964 KB Output is correct
73 Correct 24 ms 48160 KB Output is correct
74 Correct 24 ms 47964 KB Output is correct
75 Correct 25 ms 47960 KB Output is correct
76 Correct 24 ms 47964 KB Output is correct
77 Correct 24 ms 47964 KB Output is correct
78 Correct 29 ms 47952 KB Output is correct
79 Correct 553 ms 95012 KB Output is correct
80 Correct 1855 ms 90280 KB Output is correct
81 Correct 802 ms 91196 KB Output is correct
82 Correct 3027 ms 78036 KB Output is correct
83 Correct 2491 ms 77756 KB Output is correct
84 Correct 1255 ms 77900 KB Output is correct
85 Correct 288 ms 78492 KB Output is correct
86 Correct 506 ms 89936 KB Output is correct
87 Correct 1547 ms 93152 KB Output is correct
88 Correct 1276 ms 78348 KB Output is correct
89 Execution timed out 4061 ms 77688 KB Time limit exceeded
90 Halted 0 ms 0 KB -