提出 #55041993


ソースコード 拡げる

#line 1 "../atcoder/abc255/ex/main.cpp"
#include <atcoder/modint>
#include <iostream>

#line 2 "datastructure/range_map.hpp"
#include <map>
#include <vector>
template <typename T, typename S>
struct range_map {
public:
    range_map(bool merge_adjacent = true) : _merge_adjacent(merge_adjacent) {
    }
    typename std::map<T, std::pair<T, S>>::const_iterator get(T p) const {
        auto it = values.upper_bound(p);
        if (it == values.begin()) return values.end();
        if (std::prev(it)->second.first < p) return values.end();
        return std::prev(it);
    }
    typename std::map<T, std::pair<T, S>>::const_iterator get(
        std::pair<T, T> range) const {
        auto [l, r] = range;
        auto it = get(l);
        if (it == values.end()) return values.end();
        if (it->second.first < r) return values.end();
        return it;
    }
    void set(std::pair<T, T> range, S x) {
        set(range, x, [](T, T, S) {}, [](T, T, S) {});
    }
    template <class op_insert, class op_erase>
    void set(std::pair<T, T> range, S x, const op_insert &f,
             const op_erase &g) {
        auto [l, r] = range;
        auto it_l = values.upper_bound(l);
        if (it_l != values.begin() &&
            l - T(_merge_adjacent) <= std::prev(it_l)->second.first) {
            it_l--;
        }
        auto it_r = values.upper_bound(r + T(_merge_adjacent));
        std::vector<std::tuple<T, T, S>> restore;
        restore.reserve(3);
        if (it_l != values.end() && it_l->first < l) {
            if (it_l->second.second != x) {
                restore.emplace_back(it_l->first, l - 1, it_l->second.second);
            } else {
                l = it_l->first;
            }
        }
        if (it_l != it_r && r < std::prev(it_r)->second.first) {
            if (std::prev(it_r)->second.second != x) {
                restore.emplace_back(r + 1, std::prev(it_r)->second.first,
                                     std::prev(it_r)->second.second);
            } else {
                r = std::prev(it_r)->second.first;
            }
        }
        restore.emplace_back(l, r, x);
        for (auto it = it_l; it != it_r; it = values.erase(it)) {
            g(it->first, it->second.first, it->second.second);
        }
        for (auto [l, r, x] : restore) {
            values[l] = {r, x};
            f(l, r, x);
        }
    }
    typename std::map<std::pair<T, T>, S>::const_iterator begin() const {
        return values.begin();
    }
    typename std::map<std::pair<T, T>, S>::const_iterator end() const {
        return values.end();
    }

protected:
    std::map<T, std::pair<T, S>> values;
    bool _merge_adjacent;
};
#line 5 "../atcoder/abc255/ex/main.cpp"
using mint = atcoder::modint998244353;
int main() {
    long long n;
    int q;
    std::cin >> n >> q;
    range_map<long long, long long> mp;
    mp.set({0, n}, 0);
    while (q--) {
        long long d, l, r;
        std::cin >> d >> l >> r;
        mint ans = 0;
        mp.set(
            {l, r}, d,
            [&](long long l, long long r, long long x) {
                ans -= mint(r - l + 1) * (r + l) / 2 * (d - x);
            },
            [&](long long l, long long r, long long x) {
                ans += mint(r - l + 1) * (r + l) / 2 * (d - x);
            });
        std::cout << ans.val() << '\n';
    }
}

提出情報

提出日時
問題 Ex - Range Harvest Query
ユーザ gyouzasushi
言語 C++ 23 (gcc 12.2)
得点 600
コード長 3439 Byte
結果 AC
実行時間 835 ms
メモリ 28664 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 2
AC × 38
セット名 テストケース
Sample example0.txt, example1.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
ケース名 結果 実行時間 メモリ
000.txt AC 1 ms 3476 KiB
001.txt AC 496 ms 3504 KiB
002.txt AC 1 ms 3472 KiB
003.txt AC 427 ms 3468 KiB
004.txt AC 537 ms 3532 KiB
005.txt AC 686 ms 28664 KiB
006.txt AC 683 ms 15984 KiB
007.txt AC 579 ms 3408 KiB
008.txt AC 692 ms 28604 KiB
009.txt AC 835 ms 28532 KiB
010.txt AC 368 ms 3484 KiB
011.txt AC 203 ms 3488 KiB
012.txt AC 586 ms 3532 KiB
013.txt AC 531 ms 3608 KiB
014.txt AC 560 ms 3476 KiB
015.txt AC 4 ms 3520 KiB
016.txt AC 232 ms 3520 KiB
017.txt AC 167 ms 3472 KiB
018.txt AC 530 ms 3612 KiB
019.txt AC 504 ms 3472 KiB
020.txt AC 624 ms 3524 KiB
021.txt AC 627 ms 3580 KiB
022.txt AC 624 ms 3540 KiB
023.txt AC 624 ms 3476 KiB
024.txt AC 624 ms 3492 KiB
025.txt AC 620 ms 3448 KiB
026.txt AC 635 ms 3488 KiB
027.txt AC 626 ms 3532 KiB
028.txt AC 624 ms 3480 KiB
029.txt AC 633 ms 3616 KiB
030.txt AC 630 ms 3576 KiB
031.txt AC 631 ms 3668 KiB
032.txt AC 629 ms 3480 KiB
033.txt AC 625 ms 3480 KiB
034.txt AC 624 ms 3512 KiB
035.txt AC 621 ms 3480 KiB
example0.txt AC 2 ms 3536 KiB
example1.txt AC 1 ms 3408 KiB