Submission #96118

#TimeUsernameProblemLanguageResultExecution timeMemory
96118oolimryBoat (APIO16_boat)C++14
58 / 100
2064 ms8512 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<long long, long long> ii; long long mod = 1000000007; //long long dp[505][2005]; //static long long dp[505][2005][505]; #define int long long long long modInverse(long long a, long long m) { long long m0 = m; long long y = 0, x = 1; if (m == 1) return 0; while (a > 1) { // q is quotient long long q = a / m; long long t = m; // m is remainder now, process same as // Euclid's algo m = a % m, a = t; t = y; // Update y and x y = x - q * y; x = t; } // Make x positive if (x < 0) x += m0; return x; } static long long a[505]; static long long b[505]; static long long inverse[505]; static ii ranges[1010]; static long long diff[1010]; static long long posa[505]; static long long posb[505]; static long long dp[2005][505][2]; main() { //freopen("i.txt","r",stdin); ios_base::sync_with_stdio(false); for(long long i = 1;i < 505;i++){ inverse[i] = modInverse(i,mod); } int n; cin >> n; set<long long> s; for(int i = 0;i < n;i++){ cin >> a[i] >> b[i]; s.insert(a[i]); s.insert(b[i]+1); } //cout << s.size() << endl; vector<long long> key; for(set<long long>::iterator it = s.begin();it != s.end();it++){ key.push_back(*it); } //cout << k.size() << endl; int m = key.size() - 1; for(int i = 0;i < m;i++){ ranges[i] = (ii(key[i],key[i+1]-1)); } sort(ranges,ranges + m); //cout << m << "\n"; for(int i = 0;i < m;i++){ diff[i] = ranges[i].second - ranges[i].first + 1; diff[i] %= mod; //cout << ranges[i].first << " " << ranges[i].second << "\n"; } for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++){ if(ranges[j].first == a[i]) posa[i] = j; if(ranges[j].second == b[i]) posb[i] = j; } } //boat no, range, number taken b4; for(int i = 0;i < 2;i++){ for(int j = 0;j < m;j++){ for(int k = 0;k < 505;k++){ dp[j][k][i] = 0ll; } } } for(int j = posa[0];j <= posb[0];j++){ if(a[0] <= ranges[j].first && b[0] >= ranges[j].second){ dp[j][1][0] = diff[j]; //cout << a[0] << " " << ranges[j].first << " " << ranges[j].second << " " << b[0] << endl; } } for(int i = 1;i < n;i++){ long long acc[m]; fill(acc,acc+m,0); ///take nothing for this school int ii = i % 2; for(int j = 0;j < m;j++){ for(int k = 1;k < 505;k++){ long long y = dp[j][k][ii^1]; if(y == 0) break; dp[j][k][ii] = y; //dp[ii][j][k] %= mod; acc[j] += y; acc[j] %= mod; } if(j!=0){ acc[j] += acc[j-1]; acc[j] %= mod; } } ///take same as previous school for(int j = posa[i];j <= posb[i];j++){ if(a[i] <= ranges[j].first && b[i] >= ranges[j].second){ for(int k = 2;k < 505;k++){ long long x = dp[j][k-1][ii^1]; if(x == 0) break; if(diff[j] - k + 1 <= 0) break; x *= (diff[j] - k + 1); x %= mod; x *= inverse[k]; x %= mod; dp[j][k][ii] += x; //dp[ii][j][k] %= mod; } } } ///take for the first time //long long acc = 0ll; for(int j = posa[i];j <= posb[i];j++){ if(a[i] <= ranges[j].first && b[i] >= ranges[j].second){ long long x; if(j == 0) x = 0; else x = acc[j-1]; x += 1; x *= diff[j]; dp[j][1][ii] += x; dp[j][1][ii] %= mod; } } } /* for(int j = 0;j < m;j++){ cout << ranges[j].first << " " << ranges[j].second << ": "; for(int i = 0;i < n;i++){ cout << dp[i][j] << " "; } cout << "\n"; } */ long long ans = 0ll; for(int j = 0;j < m;j++){ for(int k = 1;k < 505;k++){ ans += dp[j][k][(n-1)%2]; ans %= mod; } } cout << ans; return 0; }

Compilation message (stderr)

boat.cpp:47:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main()
      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...