結果
問題 | No.2336 Do you like typical problems? |
ユーザー |
![]() |
提出日時 | 2023-06-02 21:38:55 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 269 ms / 2,000 ms |
コード長 | 3,034 bytes |
コンパイル時間 | 4,432 ms |
コンパイル使用メモリ | 273,564 KB |
実行使用メモリ | 9,504 KB |
最終ジャッジ日時 | 2024-12-28 16:52:20 |
合計ジャッジ時間 | 7,190 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 18 |
ソースコード
#if __INCLUDE_LEVEL__ == 0#include <bits/stdc++.h>using namespace std;#undef assert#define assert(expr) (expr) || (__builtin_unreachable(), 0)#include __BASE_FILE__#define ALL(f, r, ...) \[&](auto&& _) { return f(begin(_), end(_), ##__VA_ARGS__); }(r)namespace std::ranges::views {namespace {using Fp = atcoder::modint998244353;void solve() {int n;cin >> n;vector<int> b(n), c(n);for (int i : iota(0, n)) {cin >> tie(b[i], c[i]);++c[i];}auto U = b;U.insert(U.end(), c.begin(), c.end());sort(U);ALL(U.erase, unique(U));auto rank = [&](int x) { return lower_bound(U, x) - U.begin(); };vector<Fp> f(U.size());vector<Fp> f2(U.size());for (int i : iota(0, n)) {int l = rank(b[i]);int r = rank(c[i]);Fp t = 1 / Fp(c[i] - b[i]);f[l] += t;f[r] -= t;f2[l] += t * t;f2[r] -= t * t;}ALL(partial_sum, f, f.begin());ALL(partial_sum, f2, f2.begin());Fp ans = 0;for (int i : iota(1, ssize(U))) {Fp w = U[i] - U[i - 1];Fp cur = (f[i - 1] * f[i - 1] - f2[i - 1]) / 2;ans += cur * w;}ans = n * Fp(n - 1) / 2 - ans;for (int i : iota(0, n)) {ans *= i + 1;}ans /= 2;cout << ans << '\n';}} // namespace} // namespace std::ranges::viewsusing views::solve;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);solve();}#else // __INCLUDE_LEVEL__#include <atcoder/modint>namespace std {template <class T1, class T2>istream& operator>>(istream& is, pair<T1, T2>& p) {return is >> p.first >> p.second;}template <class... Ts>istream& operator>>(istream& is, tuple<Ts...>& t) {return apply([&is](auto&... xs) -> istream& { return (is >> ... >> xs); }, t);}template <class... Ts>istream& operator>>(istream& is, tuple<Ts&...>&& t) {return is >> t;}template <class R, enable_if_t<!is_convertible_v<R, string>>* = nullptr>auto operator>>(istream& is, R&& r) -> decltype(is >> *begin(r)) {for (auto&& e : r) {is >> e;}return is;}template <class T1, class T2>ostream& operator<<(ostream& os, const pair<T1, T2>& p) {return os << p.first << ' ' << p.second;}template <class... Ts>ostream& operator<<(ostream& os, const tuple<Ts...>& t) {auto f = [&os](const auto&... xs) -> ostream& {[[maybe_unused]] auto sep = "";((os << exchange(sep, " ") << xs), ...);return os;};return apply(f, t);}template <class R, enable_if_t<!is_convertible_v<R, string_view>>* = nullptr>auto operator<<(ostream& os, R&& r) -> decltype(os << *begin(r)) {auto sep = "";for (auto&& e : r) {os << exchange(sep, " ") << e;}return os;}} // namespace stdnamespace atcoder {template <class T, internal::is_modint_t<T>* = nullptr>istream& operator>>(istream& is, T& x) {int v;is >> v;x = T::raw(v);return is;}template <class T, internal::is_modint_t<T>* = nullptr>ostream& operator<<(ostream& os, const T& x) {return os << x.val();}} // namespace atcoder#endif // __INCLUDE_LEVEL__