Submission #255088

#TimeUsernameProblemLanguageResultExecution timeMemory
255088maximath_1Boat (APIO16_boat)C++11
100 / 100
448 ms8440 KiB
#include <iostream> #include <algorithm> #include <vector> using namespace std; #define ll long long const ll mod = 1e9 + 7; int n; ll st[1005], ed[1005], len[1005]; ll inv[1005], dp[1005][1005]; vector<ll> cc; ll add(ll a, ll b){ ll res = a + b; if(res >= mod) res -= mod; return res; } ll mul(ll a, ll b){ return (a * 1ll * b) % mod; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i = 1; i <= n; i ++){ cin >> st[i] >> ed[i]; ed[i] ++; } inv[1] = 1ll; for(int i = 2; i <= n; i ++) inv[i] = mul(mod / i, mod - inv[mod % i]); for(int i = 1; i <= n; i ++){ cc.push_back(st[i]);cc.push_back(ed[i]); } sort(cc.begin(), cc.end()); cc.erase(unique(cc.begin(), cc.end()), cc.end()); for(int i = 1; i <= n; i ++){ st[i] = upper_bound(cc.begin(), cc.end(), st[i]) - cc.begin(); ed[i] = upper_bound(cc.begin(), cc.end(), ed[i]) - cc.begin(); } int sz = cc.size() - 1; for(int i = 1; i <= sz; i ++) len[i] = cc[i] - cc[i - 1]; dp[0][0] = 1ll; for(int i = 1; i <= sz; i ++){ dp[i][0] = 1ll; for(int j = 1; j <= n; j ++){ ll choose = len[i]; int cnt = 1; dp[i][j] = dp[i - 1][j]; if(i < st[j] || i >= ed[j]) continue; for(int k = j - 1; k >= 0; k --){ dp[i][j] = add(dp[i][j], mul(dp[i - 1][k], choose)); if(st[k] <= i && i < ed[k]){ choose = mul(choose, mul(add(cnt, len[i]), inv[cnt + 1])); cnt ++; } } } } ll ans = 0ll; for(int i = 1; i <= n; i ++) ans = add(ans, dp[sz][i]); cout << ans << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...