Submission #48519202


Source Code Expand

#include <bits/stdc++.h>
#include <atcoder/modint>
#include <atcoder/lazysegtree>

namespace {
    using ModInt [[maybe_unused]] = atcoder::modint998244353;
    using Num [[maybe_unused]] = long long int;
    using Vec [[maybe_unused]] = std::vector<Num>;
    using Set [[maybe_unused]] = std::set<Num>;
    using Mset [[maybe_unused]] = std::multiset<Num>;
    using Edges [[maybe_unused]] = std::vector<std::vector<Num>>;

    template<typename T>
    using Q [[maybe_unused]] = std::queue<T>;

    template<typename T>
    using PQ [[maybe_unused]] = std::priority_queue<T, std::vector<T>, std::greater<T>>;
}

struct Prob {
    ModInt prob_kept {1};
    ModInt value {0};
};

struct Node {
    Num width {0};
    ModInt average {0};

    Node merge(const Node& rhs) const {
        Num w = width + rhs.width;
        if (w == 0) {
            Node node;
            return node;
        }

        ModInt lsum = average;
        lsum *= width;

        ModInt rsum = rhs.average;
        rsum *= rhs.width;

        ModInt avg = lsum + rsum;
        avg /= w;

        Node result;
        result.width = w;
        result.average = avg;
        return result;
    }

    Node update(const Prob& prob) const {
        Node result;
        result.width = width;

        ModInt v = average;
        v *= prob.prob_kept;
        v += prob.value;
        result.average = v;
        return result;
    }
};

Node func_operate(Node a, Node b) {
    return a.merge(b);
}

Node func_unit() {
    return Node();
}

Node func_map(Prob p, Node node) {
    return node.update(p);
}

Prob func_compose(Prob a, Prob b) {
    ModInt v = b.value;
    v *= a.prob_kept;
    v += a.value;

    Prob p;
    p.prob_kept = a.prob_kept * b.prob_kept;
    p.value = v;
    return p;
}

Prob func_id() {
    Prob p;
    return p;
}

void solve(std::istream& is, std::ostream& os) {
    Num n, m;
    is >> n >> m;

    Vec aset(n);
    for(auto&& x : aset) {
        is >> x;
    }

    atcoder::lazy_segtree<Node, func_operate, func_unit, Prob, func_map, func_compose, func_id> tree(n+1);
    for(Num i{0}; i<n; ++i) {
        Node node;
        node.width = 1;
        node.average = aset.at(i);
        tree.set(i, node);
    }

    for(Num i{0}; i<m; ++i) {
        Num l, r, x;
        is >> l >> r >> x;
        --l;

        ModInt inverse_p = 1;
        inverse_p /= (r - l);

        Prob prob;
        ModInt p_remaining = 1;
        p_remaining -= inverse_p;
        prob.prob_kept = p_remaining;

        ModInt value = x;
        value *= inverse_p;
        prob.value = value;

        tree.apply(l, r, prob);
    }

    for(Num i{0}; i<n; ++i) {
        os << tree.prod(i, i+1).average.val();
        if ((i+1) >= n) {
            os << "\n";
        } else {
            os << " ";
        }
    }
}

int main(void) {
    solve(std::cin, std::cout);
    return 0;
}

Submission Info

Submission Time
Task F - Random Update Query
User zettsut
Language C++ 20 (gcc 12.2)
Score 550
Code Size 3005 Byte
Status AC
Exec Time 1684 ms
Memory 18192 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 550 / 550
Status
AC × 3
AC × 39
Set Name Test Cases
Sample example0.txt, example1.txt, example2.txt
All 000.txt, 001.txt, 002.txt, 003.txt, 004.txt, 005.txt, 006.txt, 007.txt, 008.txt, 009.txt, 010.txt, 011.txt, 012.txt, 013.txt, 014.txt, 015.txt, 016.txt, 017.txt, 018.txt, 019.txt, 020.txt, 021.txt, 022.txt, 023.txt, 024.txt, 025.txt, 026.txt, 027.txt, 028.txt, 029.txt, 030.txt, 031.txt, 032.txt, 033.txt, 034.txt, 035.txt, example0.txt, example1.txt, example2.txt
Case Name Status Exec Time Memory
000.txt AC 134 ms 3304 KiB
001.txt AC 1619 ms 18176 KiB
002.txt AC 1603 ms 18164 KiB
003.txt AC 1606 ms 18028 KiB
004.txt AC 1644 ms 18120 KiB
005.txt AC 1643 ms 18040 KiB
006.txt AC 1649 ms 18176 KiB
007.txt AC 1070 ms 18076 KiB
008.txt AC 1068 ms 18188 KiB
009.txt AC 1068 ms 18100 KiB
010.txt AC 1641 ms 18032 KiB
011.txt AC 1640 ms 18096 KiB
012.txt AC 1640 ms 18120 KiB
013.txt AC 1606 ms 18084 KiB
014.txt AC 1676 ms 18164 KiB
015.txt AC 1216 ms 10992 KiB
016.txt AC 445 ms 3988 KiB
017.txt AC 706 ms 17128 KiB
018.txt AC 957 ms 17776 KiB
019.txt AC 822 ms 6572 KiB
020.txt AC 772 ms 10648 KiB
021.txt AC 461 ms 4864 KiB
022.txt AC 498 ms 10468 KiB
023.txt AC 758 ms 10268 KiB
024.txt AC 499 ms 6412 KiB
025.txt AC 1669 ms 18168 KiB
026.txt AC 1672 ms 18020 KiB
027.txt AC 1668 ms 18036 KiB
028.txt AC 1669 ms 18036 KiB
029.txt AC 1670 ms 18120 KiB
030.txt AC 1672 ms 18188 KiB
031.txt AC 1670 ms 18040 KiB
032.txt AC 1676 ms 18100 KiB
033.txt AC 1684 ms 18080 KiB
034.txt AC 1683 ms 18192 KiB
035.txt AC 1649 ms 18024 KiB
example0.txt AC 1 ms 3512 KiB
example1.txt AC 1 ms 3508 KiB
example2.txt AC 1 ms 3516 KiB