답안 #875782

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
875782 2023-11-20T13:31:50 Z danikoynov Sprinkler (JOI22_sprinkler) C++14
41 / 100
4000 ms 105668 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)
    {
        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);

    /**for (int cur : by_depth[row])
    { ///cout << "vertex " << cur << endl;
        if (tin[cur] >= lf && tin[cur] <= rf)
            h[cur] = (h[cur] * val) % l;
    }*/
}

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 24 ms 47960 KB Output is correct
3 Correct 26 ms 47856 KB Output is correct
4 Correct 25 ms 47960 KB Output is correct
5 Correct 27 ms 47952 KB Output is correct
6 Correct 32 ms 47952 KB Output is correct
7 Correct 26 ms 47964 KB Output is correct
8 Correct 29 ms 47956 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 47988 KB Output is correct
12 Correct 26 ms 47752 KB Output is correct
13 Correct 24 ms 47876 KB Output is correct
14 Correct 24 ms 47964 KB Output is correct
15 Correct 25 ms 48012 KB Output is correct
16 Correct 25 ms 47964 KB Output is correct
17 Correct 25 ms 47968 KB Output is correct
18 Correct 26 ms 47936 KB Output is correct
19 Correct 32 ms 47964 KB Output is correct
20 Correct 25 ms 47960 KB Output is correct
21 Correct 25 ms 47928 KB Output is correct
22 Correct 25 ms 47964 KB Output is correct
23 Correct 26 ms 47996 KB Output is correct
24 Correct 25 ms 47964 KB Output is correct
25 Correct 31 ms 47952 KB Output is correct
26 Correct 31 ms 48184 KB Output is correct
27 Correct 31 ms 47956 KB Output is correct
28 Correct 25 ms 47960 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 337 ms 81236 KB Output is correct
3 Correct 862 ms 84108 KB Output is correct
4 Correct 420 ms 95568 KB Output is correct
5 Correct 542 ms 84988 KB Output is correct
6 Correct 718 ms 85004 KB Output is correct
7 Correct 774 ms 84816 KB Output is correct
8 Correct 431 ms 85380 KB Output is correct
9 Correct 362 ms 102460 KB Output is correct
10 Correct 431 ms 99920 KB Output is correct
11 Correct 371 ms 85376 KB Output is correct
12 Correct 809 ms 84088 KB Output is correct
13 Correct 315 ms 84740 KB Output is correct
14 Correct 773 ms 90364 KB Output is correct
15 Correct 947 ms 90140 KB Output is correct
16 Correct 933 ms 90188 KB Output is correct
17 Correct 1101 ms 90756 KB Output is correct
18 Correct 24 ms 47964 KB Output is correct
19 Correct 25 ms 47964 KB Output is correct
20 Correct 27 ms 47764 KB Output is correct
21 Correct 28 ms 47964 KB Output is correct
22 Correct 25 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 337 ms 81236 KB Output is correct
3 Correct 862 ms 84108 KB Output is correct
4 Correct 420 ms 95568 KB Output is correct
5 Correct 542 ms 84988 KB Output is correct
6 Correct 718 ms 85004 KB Output is correct
7 Correct 774 ms 84816 KB Output is correct
8 Correct 431 ms 85380 KB Output is correct
9 Correct 362 ms 102460 KB Output is correct
10 Correct 431 ms 99920 KB Output is correct
11 Correct 371 ms 85376 KB Output is correct
12 Correct 809 ms 84088 KB Output is correct
13 Correct 315 ms 84740 KB Output is correct
14 Correct 773 ms 90364 KB Output is correct
15 Correct 947 ms 90140 KB Output is correct
16 Correct 933 ms 90188 KB Output is correct
17 Correct 1101 ms 90756 KB Output is correct
18 Correct 24 ms 47964 KB Output is correct
19 Correct 25 ms 47964 KB Output is correct
20 Correct 27 ms 47764 KB Output is correct
21 Correct 28 ms 47964 KB Output is correct
22 Correct 25 ms 47964 KB Output is correct
23 Correct 24 ms 47960 KB Output is correct
24 Correct 419 ms 89196 KB Output is correct
25 Correct 1192 ms 89988 KB Output is correct
26 Correct 386 ms 105668 KB Output is correct
27 Correct 609 ms 89628 KB Output is correct
28 Correct 828 ms 89612 KB Output is correct
29 Correct 885 ms 89224 KB Output is correct
30 Correct 445 ms 90096 KB Output is correct
31 Correct 387 ms 100744 KB Output is correct
32 Correct 474 ms 105212 KB Output is correct
33 Correct 382 ms 89568 KB Output is correct
34 Correct 1166 ms 89684 KB Output is correct
35 Correct 25 ms 47964 KB Output is correct
36 Correct 24 ms 47960 KB Output is correct
37 Correct 26 ms 47964 KB Output is correct
38 Correct 31 ms 47964 KB Output is correct
39 Correct 24 ms 47960 KB Output is correct
40 Correct 24 ms 47960 KB Output is correct
41 Correct 25 ms 47788 KB Output is correct
42 Correct 24 ms 47952 KB Output is correct
43 Correct 24 ms 47956 KB Output is correct
44 Correct 24 ms 47972 KB Output is correct
45 Correct 24 ms 47952 KB Output is correct
46 Correct 25 ms 48036 KB Output is correct
47 Correct 25 ms 47960 KB Output is correct
48 Correct 30 ms 47964 KB Output is correct
49 Correct 25 ms 47964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47960 KB Output is correct
2 Correct 541 ms 95020 KB Output is correct
3 Correct 1912 ms 90236 KB Output is correct
4 Correct 866 ms 91132 KB Output is correct
5 Correct 3999 ms 78008 KB Output is correct
6 Correct 2639 ms 77992 KB Output is correct
7 Correct 1289 ms 78092 KB Output is correct
8 Correct 323 ms 78408 KB Output is correct
9 Correct 506 ms 90028 KB Output is correct
10 Correct 1591 ms 93048 KB Output is correct
11 Correct 1660 ms 78516 KB Output is correct
12 Execution timed out 4011 ms 77932 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47964 KB Output is correct
2 Correct 550 ms 91928 KB Output is correct
3 Correct 2103 ms 86268 KB Output is correct
4 Correct 813 ms 93892 KB Output is correct
5 Correct 3521 ms 84228 KB Output is correct
6 Correct 2584 ms 84664 KB Output is correct
7 Correct 1565 ms 87988 KB Output is correct
8 Correct 342 ms 88144 KB Output is correct
9 Correct 491 ms 104720 KB Output is correct
10 Correct 1638 ms 103176 KB Output is correct
11 Correct 1641 ms 88816 KB Output is correct
12 Execution timed out 4030 ms 87500 KB Time limit exceeded
13 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47964 KB Output is correct
2 Correct 24 ms 47960 KB Output is correct
3 Correct 26 ms 47856 KB Output is correct
4 Correct 25 ms 47960 KB Output is correct
5 Correct 27 ms 47952 KB Output is correct
6 Correct 32 ms 47952 KB Output is correct
7 Correct 26 ms 47964 KB Output is correct
8 Correct 29 ms 47956 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 47988 KB Output is correct
12 Correct 26 ms 47752 KB Output is correct
13 Correct 24 ms 47876 KB Output is correct
14 Correct 24 ms 47964 KB Output is correct
15 Correct 25 ms 48012 KB Output is correct
16 Correct 25 ms 47964 KB Output is correct
17 Correct 25 ms 47968 KB Output is correct
18 Correct 26 ms 47936 KB Output is correct
19 Correct 32 ms 47964 KB Output is correct
20 Correct 25 ms 47960 KB Output is correct
21 Correct 25 ms 47928 KB Output is correct
22 Correct 25 ms 47964 KB Output is correct
23 Correct 26 ms 47996 KB Output is correct
24 Correct 25 ms 47964 KB Output is correct
25 Correct 31 ms 47952 KB Output is correct
26 Correct 31 ms 48184 KB Output is correct
27 Correct 31 ms 47956 KB Output is correct
28 Correct 25 ms 47960 KB Output is correct
29 Correct 24 ms 47964 KB Output is correct
30 Correct 337 ms 81236 KB Output is correct
31 Correct 862 ms 84108 KB Output is correct
32 Correct 420 ms 95568 KB Output is correct
33 Correct 542 ms 84988 KB Output is correct
34 Correct 718 ms 85004 KB Output is correct
35 Correct 774 ms 84816 KB Output is correct
36 Correct 431 ms 85380 KB Output is correct
37 Correct 362 ms 102460 KB Output is correct
38 Correct 431 ms 99920 KB Output is correct
39 Correct 371 ms 85376 KB Output is correct
40 Correct 809 ms 84088 KB Output is correct
41 Correct 315 ms 84740 KB Output is correct
42 Correct 773 ms 90364 KB Output is correct
43 Correct 947 ms 90140 KB Output is correct
44 Correct 933 ms 90188 KB Output is correct
45 Correct 1101 ms 90756 KB Output is correct
46 Correct 24 ms 47964 KB Output is correct
47 Correct 25 ms 47964 KB Output is correct
48 Correct 27 ms 47764 KB Output is correct
49 Correct 28 ms 47964 KB Output is correct
50 Correct 25 ms 47964 KB Output is correct
51 Correct 24 ms 47960 KB Output is correct
52 Correct 419 ms 89196 KB Output is correct
53 Correct 1192 ms 89988 KB Output is correct
54 Correct 386 ms 105668 KB Output is correct
55 Correct 609 ms 89628 KB Output is correct
56 Correct 828 ms 89612 KB Output is correct
57 Correct 885 ms 89224 KB Output is correct
58 Correct 445 ms 90096 KB Output is correct
59 Correct 387 ms 100744 KB Output is correct
60 Correct 474 ms 105212 KB Output is correct
61 Correct 382 ms 89568 KB Output is correct
62 Correct 1166 ms 89684 KB Output is correct
63 Correct 25 ms 47964 KB Output is correct
64 Correct 24 ms 47960 KB Output is correct
65 Correct 26 ms 47964 KB Output is correct
66 Correct 31 ms 47964 KB Output is correct
67 Correct 24 ms 47960 KB Output is correct
68 Correct 24 ms 47960 KB Output is correct
69 Correct 25 ms 47788 KB Output is correct
70 Correct 24 ms 47952 KB Output is correct
71 Correct 24 ms 47956 KB Output is correct
72 Correct 24 ms 47972 KB Output is correct
73 Correct 24 ms 47952 KB Output is correct
74 Correct 25 ms 48036 KB Output is correct
75 Correct 25 ms 47960 KB Output is correct
76 Correct 30 ms 47964 KB Output is correct
77 Correct 25 ms 47964 KB Output is correct
78 Correct 24 ms 47960 KB Output is correct
79 Correct 541 ms 95020 KB Output is correct
80 Correct 1912 ms 90236 KB Output is correct
81 Correct 866 ms 91132 KB Output is correct
82 Correct 3999 ms 78008 KB Output is correct
83 Correct 2639 ms 77992 KB Output is correct
84 Correct 1289 ms 78092 KB Output is correct
85 Correct 323 ms 78408 KB Output is correct
86 Correct 506 ms 90028 KB Output is correct
87 Correct 1591 ms 93048 KB Output is correct
88 Correct 1660 ms 78516 KB Output is correct
89 Execution timed out 4011 ms 77932 KB Time limit exceeded
90 Halted 0 ms 0 KB -