Submission #163337

#TimeUsernameProblemLanguageResultExecution timeMemory
163337AkashiBoat (APIO16_boat)C++14
58 / 100
2041 ms14280 KiB
#include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; struct interv{ int x, y; }; interv a[501]; int n, sz; int dif[2001]; int inv_mod[2001]; int d[501][2001]; int C[2001][2001], C2[501][501]; vector <int> v; int lgput(int x, int p){ int aux = x, ans = 1; for(int i = 1; i <= p ; i = i << 1){ if(i & p) ans = (1LL * ans * aux) % MOD; aux = (1LL * aux * aux) % MOD; } return ans; } void calc_comb(int lin, int n, int k){ int prod = 1; C[lin][0] = 1; for(int i = 1; i <= k ; ++i){ prod = (1LL * prod * (n - i + 1)) % MOD; prod = (1LL * prod * inv_mod[i]) % MOD; C[lin][i] = prod; } } void prec(){ C2[0][0] = 1; for(int i = 1; i <= n ; ++i){ C2[i][0] = 1; for(int j = 1; j <= i ; ++j){ C2[i][j] = C2[i - 1][j] + C2[i - 1][j - 1]; if(C2[i][j] >= MOD) C2[i][j] -= MOD; } } for(int i = 1; i <= n ; ++i) inv_mod[i] = lgput(i, MOD - 2); for(int k = 2; k <= sz ; ++k) calc_comb(k, dif[k], min(n, dif[k])); } int main() { // freopen("1.in", "r", stdin); scanf("%d", &n); for(int i = 1; i <= n ; ++i){ scanf("%d%d", &a[i].x, &a[i].y); v.push_back(a[i].x); v.push_back(a[i].x - 1); v.push_back(a[i].y); v.push_back(a[i].y - 1); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); sz = v.size(); for(int i = 2; i <= sz ; ++i) dif[i] = v[i - 1] - v[i - 2]; for(int i = 1; i <= n ; ++i){ a[i].x = lower_bound(v.begin(), v.end(), a[i].x) - v.begin() + 1; a[i].y = lower_bound(v.begin(), v.end(), a[i].y) - v.begin() + 1; } prec(); for(int j = 0; j <= sz ; ++j) d[0][j] = 1; for(int j = a[1].x; j <= a[1].y ; ++j) d[1][j] = dif[j]; d[1][0] += 1; for(int j = 1; j <= sz ; ++j){ d[1][j] += d[1][j - 1]; if(d[1][j] >= MOD) d[1][j] -= MOD; } for(int i = 2; i <= n ; ++i){ for(int j = a[i].x; j <= a[i].y ; ++j){ int nr = 0; ++nr; d[i][j] = d[i][j] + (1LL * d[i - 1][j - 1] * dif[j]) % MOD; if(d[i][j] >= MOD) d[i][j] -= MOD; for(int k = i - 1; k >= 1 ; --k){ if(a[k].y < j || a[k].x > j) continue ; ++nr; int Sum = 0; for(int t = 2; t <= nr && t <= dif[j] ; ++t){ Sum = Sum + (1LL * C[j][t] * C2[nr - 2][t - 2]) % MOD; if(Sum >= MOD) Sum -= MOD; } d[i][j] = d[i][j] + (1LL * d[k - 1][j - 1] * Sum) % MOD; if(d[i][j] >= MOD) d[i][j] -= MOD; } } for(int j = 1; j <= sz ; ++j){ d[i][j] += d[i][j - 1]; if(d[i][j] >= MOD) d[i][j] -= MOD; } for(int j = 0; j <= sz ; ++j){ d[i][j] += d[i - 1][j]; if(d[i][j] >= MOD) d[i][j] -= MOD; } } --d[n][sz]; if(d[n][sz] < 0) d[n][sz] += MOD; printf("%d", d[n][sz]); return 0; }

Compilation message (stderr)

boat.cpp: In function 'int main()':
boat.cpp:58:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n);
     ~~~~~^~~~~~~~~~
boat.cpp:60:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &a[i].x, &a[i].y);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...