Submission #793423

#TimeUsernameProblemLanguageResultExecution timeMemory
793423IvanJBoat (APIO16_boat)C++17
100 / 100
443 ms4324 KiB
#include<bits/stdc++.h>

#define pb push_back
#define x first
#define y second
#define all(a) (a).begin(), (a).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

const int maxn = 1005;
const int MOD = 1e9 + 7;

int mult(ll a, ll b) {return (a * b) % MOD;}
int pot(int n, int k) {
	int ret = 1, pot = n;
	for(;k > 0;k >>= 1, pot = mult(pot, pot)) 
		if(k & 1) ret = mult(ret, pot);
	return ret;
}
int divide(int a, int b) {return mult(a, pot(b, MOD - 2));}
int add(int a, int b) {a += b;if(a >= MOD) a -= MOD;return a;}
int sub(int a, int b) {a -= b;if(a < 0) a += MOD;return a;}

int n, m;
int a[maxn], b[maxn];
int len[maxn], inv[maxn];
int dp[maxn][maxn];
vector<int> v;

int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) 
		scanf("%d%d", a + i, b + i), b[i]++;
	
	for(int i = 1;i <= n;i++) 
		inv[i] = divide(1, i);

	for(int i = 1;i <= n;i++)
		v.pb(a[i]), v.pb(b[i]);
	sort(v.begin(), v.end());
	v.resize(unique(all(v)) - v.begin());
    
	for(int i = 1;i <= n;i++) {
		a[i] = lower_bound(all(v), a[i]) - v.begin() + 1;
		b[i] = lower_bound(all(v), b[i]) - v.begin() + 1;
	}
    
	m = (int)v.size() - 1;
	for(int i = 1;i <= m;i++) 
		len[i] = v[i] - v[i - 1];

	dp[0][0] = 1;
	for(int i = 1;i <= m;i++){
		dp[i][0] = 1;
		for(int j = 1;j <= n;j++){
			ll to_mul = len[i];
			int cnt = 1;
			dp[i][j] = dp[i - 1][j];
			if(i < a[j] || i >= b[j]) continue;
			
			for(int k = j - 1;k >= 0;k--) {
				dp[i][j] = add(dp[i][j], mult(dp[i - 1][k], to_mul));
				if(a[k] <= i && i < b[k]) {
					to_mul = mult(mult(to_mul, add(cnt, len[i])), inv[cnt + 1]);
					cnt++;
				}
			}
		}
	}
	int ans = 0;
	for(int i = 1;i <= n;i++) 
		ans = add(ans, dp[m][i]);
	printf("%d\n", ans);
	return 0;
}

Compilation message (stderr)

boat.cpp: In function 'int main()':
boat.cpp:34:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
boat.cpp:36:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |   scanf("%d%d", a + i, b + 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...