Submission #101889

#TimeUsernameProblemLanguageResultExecution timeMemory
101889KCSCBoat (APIO16_boat)C++14
100 / 100
671 ms3456 KiB
#include <bits/stdc++.h> using namespace std; const int DIM = 505; const int MOD = 1000000007; vector<int> lst; pair<int, int> seg[DIM]; int dp[DIM], dp2[DIM][DIM]; int fct[DIM], inv[DIM], cmb[DIM * 2][DIM]; int logPow(int x, int n) { if (!n) { return 1; } int y = logPow(x, n >> 1); if (n | 1) { y = 1LL * y * y % MOD; } if (n & 1) { y = 1LL * y * x % MOD; } return y; } int main(void) { #ifdef HOME freopen("boat.in", "r", stdin); freopen("boat.out", "w", stdout); #endif int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> seg[i].first >> seg[i].second; lst.push_back(seg[i].first); lst.push_back(++seg[i].second); } sort(lst.begin(), lst.end()); lst.resize(unique(lst.begin(), lst.end()) - lst.begin()); fct[0] = inv[0] = 1; for (int i = 1; i <= n; ++i) { fct[i] = 1LL * fct[i - 1] * i % MOD; inv[i] = logPow(fct[i], MOD - 2); } for (int i = 1; i < lst.size(); ++i) { int dif = lst[i] - lst[i - 1]; cmb[i][0] = 1; for (int j = 1; j <= n; ++j) { cmb[i][j] = 1LL * cmb[i][j - 1] * (dif - j + 1) % MOD; } for (int j = 1; j <= n; ++j) { cmb[i][j] = 1LL * cmb[i][j] * inv[j] % MOD; } } for (int i = 0; i <= n; ++i) { dp[i] = 1; } for (int i = 1; i < lst.size(); ++i) { int dif = lst[i] - lst[i - 1]; for (int j = 0; j <= n; ++j) { dp2[0][j] = dp[j]; } for (int j = 1; j <= min(dif, n); ++j) { for (int k = j; k <= n; ++k) { dp2[j][k] = dp2[j][k - 1]; if (seg[k].first <= lst[i - 1] and seg[k].second >= lst[i]) { dp2[j][k] = (dp2[j][k] + dp2[j - 1][k - 1]) % MOD; } dp[k] = (1LL * dp2[j][k] * cmb[i][j] + dp[k]) % MOD; } } } cout << (dp[n] - 1 + MOD) % MOD; return 0; }

Compilation message (stderr)

boat.cpp: In function 'int main()':
boat.cpp:35:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 1; i < lst.size(); ++i) {
                  ~~^~~~~~~~~~~~
boat.cpp:44:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 1; i < lst.size(); ++i) {
                  ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...