답안 #637727

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
637727 2022-09-02T19:48:03 Z lovrot Boat (APIO16_boat) C++11
36 / 100
519 ms 21384 KB
#include <bits/stdc++.h> 

#define ll long long
#define pii pair<ll, ll> 
#define X first
#define Y second
#define pb push_back

using namespace std; 

const int N = 1010;
const ll MOD = 1e9 + 7;

ll n, intcnt, l[N], r[N];
ll siz[N], fact[N], povrh[N][N], inv[N];
ll dp[N][N], calc[N][N];

int u[N][N];

vector<pii> intv;
vector<ll> v;

ll add(ll a, ll b){ 
	return (a + b >= MOD ? a + b - MOD : a + b);
}

ll mult(ll a, ll b){ 
	return a * b % MOD;
}

ll fastpow(ll b, ll e){ 
	ll ret = 1;
	while(e){
		if(e & 1) ret = mult(ret, b);
		b = mult(b, b);
		e >>= 1;
	}
	return ret;
}

ll divd(ll a, ll b){ 
	return mult(a, fastpow(b, MOD - 2));
}

void precompute(){ 
	fact[0] = 1;
	for(int i = 1; i < N; i++){ 
		fact[i] = mult(fact[i - 1], i);
		inv[i] = fastpow(fact[i], MOD - 2);
	}
	for(int i = 0; i < N / 2; i++) for(int j = 0; j <= i; j++) povrh[i][j] = divd(fact[i], mult(fact[j], fact[i - j]));
	
	for(int i = 0; i < intcnt; i++){
		ll sfact = 1; 
		for(ll k = 1; k <= n; k++){ 
			ll sfact = 1;
			for(ll j = 1; j <= min(k, siz[i]); j++){ 
				sfact = mult(sfact, siz[i] - j + 1);
				calc[i][k] = add(calc[i][k], mult(povrh[k - 1][j - 1], mult(sfact, inv[j])));
			}
		}
	}
}

ll DP(int x, int b){ 
	if(b >= intcnt) return 1;
	if(dp[x][b] != -1) return dp[x][b];

	dp[x][b] = DP(x, b + 1);

	int cnt = 0;
	for(int i = x; i < n; i++){ 
		cnt += u[i][b];
		if(u[i][b]) dp[x][b] = add(dp[x][b], mult(calc[b][cnt], DP(i + 1, b + 1)));
	}

	return dp[x][b];
}

int main(){ 
	for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) dp[i][j] = -1;

	scanf("%d", &n);

	for(int i = 0; i < n; i++){ 
		scanf("%lld%lld", &l[i], &r[i]);
		v.pb(l[i]);
		v.pb(r[i]);
	}

	sort(v.begin(), v.end());
	v.resize(unique(v.begin(), v.end()) - v.begin());

	for(int i = 0; i < v.size(); i++){ 
		if(i != 0 && v[i - 1] < v[i] - 1){ 
			intv.pb({v[i - 1] + 1, v[i] - 1});
		}
		intv.pb({v[i], v[i]});
	}

	intcnt = intv.size();
 
	for(int i = 0; i < intcnt; i++) siz[i] = intv[i].Y - intv[i].X + 1;

	for(int i = 0; i < n; i++){
		for(ll j = 0; j < intcnt; j++){ 
			if(intv[j].X >= l[i] && intv[j].Y <= r[i]){ 
				u[i][j] = true;
			}
		}
		// printf("%d %d %d\n", i, poc[i], kraj[i]);
	}

	precompute();
	
	printf("%lld\n", add(DP(0, 0), MOD - 1));
	return 0;
}

Compilation message

boat.cpp: In function 'void precompute()':
boat.cpp:54:6: warning: unused variable 'sfact' [-Wunused-variable]
   54 |   ll sfact = 1;
      |      ^~~~~
boat.cpp: In function 'int main()':
boat.cpp:83:10: warning: format '%d' expects argument of type 'int*', but argument 2 has type 'long long int*' [-Wformat=]
   83 |  scanf("%d", &n);
      |         ~^   ~~
      |          |   |
      |          |   long long int*
      |          int*
      |         %lld
boat.cpp:94:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |  for(int i = 0; i < v.size(); i++){
      |                 ~~^~~~~~~~~~
boat.cpp:83:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
boat.cpp:86:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |   scanf("%lld%lld", &l[i], &r[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 519 ms 20964 KB Output is correct
2 Correct 487 ms 20948 KB Output is correct
3 Correct 505 ms 21072 KB Output is correct
4 Correct 487 ms 20940 KB Output is correct
5 Correct 487 ms 21072 KB Output is correct
6 Correct 519 ms 21240 KB Output is correct
7 Correct 511 ms 21324 KB Output is correct
8 Correct 502 ms 21304 KB Output is correct
9 Correct 517 ms 21244 KB Output is correct
10 Correct 504 ms 21320 KB Output is correct
11 Correct 515 ms 21384 KB Output is correct
12 Correct 509 ms 21272 KB Output is correct
13 Correct 505 ms 21268 KB Output is correct
14 Correct 516 ms 21356 KB Output is correct
15 Correct 502 ms 21284 KB Output is correct
16 Correct 110 ms 14636 KB Output is correct
17 Correct 118 ms 14712 KB Output is correct
18 Correct 109 ms 14744 KB Output is correct
19 Correct 118 ms 14780 KB Output is correct
20 Correct 123 ms 14692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 519 ms 20964 KB Output is correct
2 Correct 487 ms 20948 KB Output is correct
3 Correct 505 ms 21072 KB Output is correct
4 Correct 487 ms 20940 KB Output is correct
5 Correct 487 ms 21072 KB Output is correct
6 Correct 519 ms 21240 KB Output is correct
7 Correct 511 ms 21324 KB Output is correct
8 Correct 502 ms 21304 KB Output is correct
9 Correct 517 ms 21244 KB Output is correct
10 Correct 504 ms 21320 KB Output is correct
11 Correct 515 ms 21384 KB Output is correct
12 Correct 509 ms 21272 KB Output is correct
13 Correct 505 ms 21268 KB Output is correct
14 Correct 516 ms 21356 KB Output is correct
15 Correct 502 ms 21284 KB Output is correct
16 Correct 110 ms 14636 KB Output is correct
17 Correct 118 ms 14712 KB Output is correct
18 Correct 109 ms 14744 KB Output is correct
19 Correct 118 ms 14780 KB Output is correct
20 Correct 123 ms 14692 KB Output is correct
21 Incorrect 48 ms 19400 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 13696 KB Output is correct
2 Correct 33 ms 13576 KB Output is correct
3 Correct 34 ms 13576 KB Output is correct
4 Correct 34 ms 13680 KB Output is correct
5 Correct 35 ms 13608 KB Output is correct
6 Correct 38 ms 13604 KB Output is correct
7 Correct 37 ms 13600 KB Output is correct
8 Correct 37 ms 13672 KB Output is correct
9 Correct 38 ms 13644 KB Output is correct
10 Correct 38 ms 13644 KB Output is correct
11 Correct 37 ms 13644 KB Output is correct
12 Correct 34 ms 13616 KB Output is correct
13 Correct 35 ms 13692 KB Output is correct
14 Correct 37 ms 13692 KB Output is correct
15 Correct 36 ms 13592 KB Output is correct
16 Correct 27 ms 12504 KB Output is correct
17 Correct 28 ms 12576 KB Output is correct
18 Correct 28 ms 12568 KB Output is correct
19 Correct 27 ms 12452 KB Output is correct
20 Correct 28 ms 12544 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 519 ms 20964 KB Output is correct
2 Correct 487 ms 20948 KB Output is correct
3 Correct 505 ms 21072 KB Output is correct
4 Correct 487 ms 20940 KB Output is correct
5 Correct 487 ms 21072 KB Output is correct
6 Correct 519 ms 21240 KB Output is correct
7 Correct 511 ms 21324 KB Output is correct
8 Correct 502 ms 21304 KB Output is correct
9 Correct 517 ms 21244 KB Output is correct
10 Correct 504 ms 21320 KB Output is correct
11 Correct 515 ms 21384 KB Output is correct
12 Correct 509 ms 21272 KB Output is correct
13 Correct 505 ms 21268 KB Output is correct
14 Correct 516 ms 21356 KB Output is correct
15 Correct 502 ms 21284 KB Output is correct
16 Correct 110 ms 14636 KB Output is correct
17 Correct 118 ms 14712 KB Output is correct
18 Correct 109 ms 14744 KB Output is correct
19 Correct 118 ms 14780 KB Output is correct
20 Correct 123 ms 14692 KB Output is correct
21 Incorrect 48 ms 19400 KB Output isn't correct
22 Halted 0 ms 0 KB -