Submission #124998

#TimeUsernameProblemLanguageResultExecution timeMemory
124998Mamnoon_SiamBoat (APIO16_boat)C++17
100 / 100
766 ms2552 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mod = 1e9 + 7; ll qpow(ll b, ll p) { ll ret = 1; while(p) { if(p & 1) ret = (ret * b) % mod; b = (b * b) % mod, p >>= 1; } return ret; } struct base { ll x; void fix() { if(x < 0 or x >= mod) x %= mod; if(x < 0) x += mod; } base() {x = 0;} base(int _x) { x = _x; fix(); } base(ll _x) { x = _x; fix(); } base operator + (const base &o) const { base ret; ret.x = x + o.x; if(ret.x >= mod) { ret.x -= mod; } return ret; } base operator * (const base &o) const { return base(x * o.x); } base operator / (const base &o) const { return base(x * qpow(o.x, mod - 2)); } void operator += (const base &o) { (*this) = (*this) + o; } void operator *= (const base &o) { (*this) = (*this) * o; } }; const int maxn = 505; int n; int a[maxn], b[maxn]; int N_rng; int l[maxn << 1], r[maxn << 1]; base inv[maxn]; base dp[maxn]; base RngC[maxn]; base C[maxn][maxn]; base g[maxn]; int main(int argc, char const *argv[]) { scanf("%d", &n); vector<int> tmp; for(int i = 1; i <= n; i++) { scanf("%d %d", &a[i], &b[i]); a[i]--; tmp.emplace_back(a[i]); tmp.emplace_back(b[i]); } sort(tmp.begin(), tmp.end()); tmp.erase(unique(tmp.begin(), tmp.end()), tmp.end()); for(int i = 1; i < tmp.size(); i++) { N_rng++; l[N_rng] = tmp[i - 1]; r[N_rng] = tmp[i]; } inv[0] = 1; for(int i = 1; i <= n; i++) { inv[i] = base(1) / i; } for(int i = 0; i <= n; i++) { C[i][0] = 1; } for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++) { C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; } } dp[0] = 1; for(int rng = 1; rng <= N_rng; rng++) { RngC[0] = 1; for(int i = 1, sz = r[rng] - l[rng]; i <= n; i++, sz--) { RngC[i] = sz < 1 ? 0 : RngC[i - 1] * inv[i] * sz; } for(int k = 1; (g[k].x = 0) or k <= n; k++) { for(int i = 1; i <= k; i++) { g[k] += C[k - 1][i - 1] * RngC[i]; } } for(int i = n; i >= 1; i--) { if(a[i] <= l[rng] and r[rng] <= b[i]) { int cnt = 0; for(int k = i; k >= 1; k--) { if(a[k] <= l[rng] and r[rng] <= b[k]) { cnt++; } dp[i] += dp[k - 1] * g[cnt]; } } } } base ans = 0; for(int i = 1; i <= n; i++) { ans += dp[i]; } printf("%d\n", (int)ans.x); return 0; }

Compilation message (stderr)

boat.cpp: In function 'int main(int, const char**)':
boat.cpp:67:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 1; i < tmp.size(); i++) {
                 ~~^~~~~~~~~~~~
boat.cpp:55:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
boat.cpp:58:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &a[i], &b[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...