답안 #558144

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
558144 2022-05-07T00:46:13 Z Sweezy Boat (APIO16_boat) C++17
0 / 100
13 ms 6228 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, vector<int> (sz(cs)));
    rep(pos, sz(segs)) {
      if (segs[pos].first >= l[0] && segs[pos].second <= r[0]) {
        dp[0][pos] = segs[pos].second - segs[pos].first + 1;
      }
    }
    reps(i, 1, n) {
      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;
        add(dp[i][pos], len);
        rep(prev, pos) {
          add(dp[i][pos], mul(len, dp[i - 1][prev]));
        }
        int cur = 0;
        for (int j = i; j >= i; j--) {
          reps(cnt, 2, min(cur + 1, len + 1)) {
            rep(prev, pos) {
              add(dp[i][pos], mul(C(len, cnt), dp[j][prev]));
            }
          }
          if (segs[pos].first >= l[j] && segs[pos].second <= r[j]) {
            cur++;
          }
        }
      }
      debug(i, dp);
    }

    int res = 0;
    reps(i, 0, n) {
      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:195:7: note: in expansion of macro 'debug'
  195 |       debug(i, dp);
      |       ^~~~~
boat.cpp:163:10: warning: variable 'sub' set but not used [-Wunused-but-set-variable]
  163 |     auto sub = [&] (int a, int b) {
      |          ^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 6228 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 6228 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 596 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 6228 KB Output isn't correct
2 Halted 0 ms 0 KB -