답안 #558132

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558132 2022-05-07T00:12:23 Z Sweezy Boat (APIO16_boat) C++17
0 / 100
2000 ms 18144 KB
  #include <bits/stdc++.h>

  using namespace std;
  #define int long long

  template <typename A, typename B>
  string to_string(pair<A, B> p);

  template <typename A, typename B, typename C>
  string to_string(tuple<A, B, C> p);

  template <typename A, typename B, typename C, typename D>
  string to_string(tuple<A, B, C, D> p);

  string to_string(const string& s) {
    return '"' + s + '"';
  }

  string to_string(const char* s) {
    return to_string((string) s);
  }

  string to_string(bool b) {
    return (b ? "true" : "false");
  }

  string to_string(vector<bool> v) {
    bool first = true;
    string res = "{";
    for (int i = 0; i < static_cast<int>(v.size()); i++) {
      if (!first) {
        res += ", ";
      }
      first = false;
      res += to_string(v[i]);
    }
    res += "}";
    return res;
  }

  template <size_t N>
  string to_string(bitset<N> v) {
    string res = "";
    for (size_t i = 0; i < N; i++) {
      res += static_cast<char>('0' + v[i]);
    }
    return res;
  }

  template <typename A>
  string to_string(A v) {
    bool first = true;
    string res = "{";
    for (const auto &x : v) {
      if (!first) {
        res += ", ";
      }
      first = false;
      res += to_string(x);
    }
    res += "}";
    return res;
  }

  template <typename A, typename B>
  string to_string(pair<A, B> p) {
    return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
  }

  template <typename A, typename B, typename C>
  string to_string(tuple<A, B, C> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")";
  }

  template <typename A, typename B, typename C, typename D>
  string to_string(tuple<A, B, C, D> p) {
    return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")";
  }
    
  void debug_out() { cerr << endl; }

  template <typename Head, typename... Tail>
  void debug_out(Head H, Tail... T) {
    cerr << " " << to_string(H);
    debug_out(T...);
  }

  #ifdef LOCAL
  #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__)
  #else
  #define debug(...) 42
  #endif

  #define all(a) (a).begin(), (a).end()
  #define rep(i, n) for (int i = 0; i < (n); ++i)
  #define reps(i, s, n) for (int i = s; i < (n); ++i)
  #define pb push_back
  #define sz(a) (int) (a.size())

  const int mod = 1e9 + 7;

  void solve() {
    int n;
    cin >> n;
    vector<int> l(n), r(n), cs;
    rep(i, n) {
      cin >> l[i] >> r[i];
      cs.pb(l[i]);
      cs.pb(r[i] - 1);
      cs.pb(r[i]);
      cs.pb(r[i] + 1);
    }

    sort(all(cs));
    cs.erase(unique(all(cs)), cs.end());
    vector<pair<int, int>> segs;
    rep(i, sz(cs) - 1) {
      segs.emplace_back(cs[i], cs[i + 1] - 1);
    }
    segs.emplace_back(cs.back(), cs.back());

    debug(segs);

    auto add = [&] (int &a, int b) -> void {
      (a += b) %= mod;
    };

    auto mul = [&] (int a, int b) {
      return a * b % mod;
    };

    auto binpow = [&] (int a, int n) {
      int res = 1;
      while (n) {
        if (n % 2) {
          res = mul(res, a);
        }
        a = mul(a, a);
        n /= 2;
      }
      return res;
    };

    auto inv = [&] (int val) {
      return binpow(val, mod - 2);
    };

    vector<int> f(n + 1), rf(n + 1);
    f[0] = rf[0] = 1;
    reps(i, 1, n + 1) {
      f[i] = mul(f[i - 1], i);
      rf[i] = inv(f[i]);
    }

    auto C = [&] (int n, int k) {
      int res = 1;
      reps(i, 1, k + 1) {
        res = mul(res, n - k + i);
      }
      return mul(res, rf[k]);
    };

    auto sub = [&] (int a, int b) {
      a -= b;
      if (a < 0) a += mod;
      return a;
    };

    vector<vector<int>> dp(n + 1, vector<int> (sz(cs)));
    rep(i, n) {
      vector<vector<int>> p(sz(cs), vector<int> (n + 1));
      rep(j, sz(cs)) {
        p[j][0] = dp[0][j];
        reps(k, 1, n + 1) {
          add(p[j][k], p[j][k - 1]);
          add(p[j][k], dp[k][j]);
        }
      }
      vector<vector<int>> ndp(n + 1, vector<int> (sz(cs)));
      rep(pos, sz(segs)) {
        if (segs[pos].first < l[i] || segs[pos].second > r[i]) continue;
        int len = segs[pos].second - segs[pos].first + 1;
        debug(pos, len);
        reps(cnt, 1, i + 2) {
          rep(prev, pos) {
            add(ndp[cnt][pos], mul(len, dp[cnt - 1][prev]));
            int from = cnt - min(len, cnt);
            int to = cnt - 2;
            if (from <= to) {
              add(ndp[cnt][pos], mul(C(len, cnt), sub(p[prev][to], (from ? p[prev][from - 1] : 0))));
            }
          }
          if (len >= cnt) {
            add(ndp[cnt][pos], C(len, cnt));
          }
        }
      }
      reps(j, 1, n + 1) {
        rep(k, sz(segs)) {
          add(dp[j][k], ndp[j][k]);
        }
      }
    }

    int res = 0;
    reps(i, 1, n + 1) {
      rep(j, sz(segs)) {
        add(res, dp[i][j]);
      }
    }

    cout << res;
  }

  signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
  }

Compilation message

boat.cpp: In function 'void solve()':
boat.cpp:91:22: warning: statement has no effect [-Wunused-value]
   91 |   #define debug(...) 42
      |                      ^~
boat.cpp:122:5: note: in expansion of macro 'debug'
  122 |     debug(segs);
      |     ^~~~~
boat.cpp:91:22: warning: statement has no effect [-Wunused-value]
   91 |   #define debug(...) 42
      |                      ^~
boat.cpp:183:9: note: in expansion of macro 'debug'
  183 |         debug(pos, len);
      |         ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2098 ms 18144 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2098 ms 18144 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2068 ms 1304 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2098 ms 18144 KB Time limit exceeded
2 Halted 0 ms 0 KB -