답안 #376088

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
376088 2021-03-10T20:43:48 Z shivensinha4 Boat (APIO16_boat) C++17
9 / 100
1508 ms 16236 KB
#include "bits/stdc++.h"
using namespace std;
#define for_(i, s, e) for (int i = s; i < (int) e; i++)
#define for__(i, s, e) for (ll i = s; i < e; i++)
typedef long long ll;
typedef vector<int> vi;
typedef array<int, 2> ii;
// #define endl '\n'

const ll mod = 1e9+7;

ll power(ll x, ll y) {
	if (y == 0) return 1;
	ll p = power(x, y/2) % mod;
	p = (p * p) % mod;
  
	return (y%2 == 0)? p : (x * p) % mod;
}

ll modInverse(ll a) {
	return power(a, mod-2);
}

const int MXN = 500;
ll choose[4*MXN+2][MXN+1], dp[2][MXN+1][MXN+1][2];

int main() {
#ifdef mlocal
	freopen("test.in", "r", stdin);
#endif
	
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	
	int n; cin >> n;
	vector<ii> lt(n);
	vi raw(2*n);
	
	for_(i, 0, n) {
		cin >> lt[i][0] >> lt[i][1];
		raw[2*i] = lt[i][0], raw[2*i+1] = lt[i][1];
	}
	
	sort(raw.begin(), raw.end());
	// raw.resize(unique(raw.begin(), raw.end()) - raw.begin());
	
	vector<ii> seg;
	int pre = raw[0];
	if (raw[0] == raw[1]) {
		seg.push_back({raw[0], raw[0]});
		pre = raw[0]+1;
	}
	
	for_(i, 1, raw.size()) {
		if (raw[i] == raw[i-1]) continue;
		
		bool ind = i < 2*n-1 and raw[i] == raw[i+1];
		if (pre <= raw[i]) seg.push_back({pre, raw[i] - ind});
		if (ind) seg.push_back({raw[i], raw[i]});
		pre = raw[i]+1;
	}
	
	// for (auto i: seg) cout << i[0] << " " << i[1] << endl;
	
	int ns = seg.size();
	memset(choose, 0, sizeof(choose)); memset(dp, 0, sizeof(dp));
	
	for_(i, 0, ns) {
		choose[i][0] = 1;
		for_(r, 1, min(n, seg[i][1]-seg[i][0]+1) + 1) choose[i][r] = (((choose[i][r-1] * (seg[i][1]-seg[i][0]-r+2)) % mod) * modInverse(r)) % mod;
	}
	
	int c = 0;
	for (int s = ns-1; s >= 0; s--) {
		memset(dp[c], 0, sizeof(dp[c]));
		
		for (int ct = min(n-1, seg[s][1]-seg[s][0]+1); ct >= 0; ct--) {
			dp[c][ct][n][0] = choose[s][ct];
			
			for (int idx = n-1; idx >= 0; idx--) {
				if (seg[s][0] >= lt[idx][0] and seg[s][1] <= lt[idx][1]) dp[c][ct][idx][1] += dp[c][ct+1][idx+1][0];
				if (dp[c][ct][idx][1] >= mod) dp[c][ct][idx][1] -= mod;
				
				dp[c][ct][idx][1] += (choose[s][ct] * (s < ns-1 ? dp[1-c][0][idx][1] : 0)) % mod;
				if (dp[c][ct][idx][1] >= mod) dp[c][ct][idx][1] -= mod;
				
				dp[c][ct][idx][0] = (dp[c][ct][idx][1] + dp[c][ct][idx+1][0]) % mod;
			}
		}
		c = 1-c;
	}
	
	cout << (dp[1-c][0][0][0]-1+mod) % mod << endl;
	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1484 ms 16236 KB Output is correct
2 Correct 1503 ms 16236 KB Output is correct
3 Correct 1505 ms 16140 KB Output is correct
4 Correct 1508 ms 16108 KB Output is correct
5 Correct 1490 ms 16140 KB Output is correct
6 Correct 1459 ms 16108 KB Output is correct
7 Correct 1461 ms 16108 KB Output is correct
8 Correct 1442 ms 16236 KB Output is correct
9 Correct 1405 ms 16236 KB Output is correct
10 Correct 1398 ms 16236 KB Output is correct
11 Correct 1399 ms 16140 KB Output is correct
12 Correct 1418 ms 16140 KB Output is correct
13 Correct 1450 ms 16236 KB Output is correct
14 Correct 1462 ms 16140 KB Output is correct
15 Correct 1453 ms 16108 KB Output is correct
16 Correct 269 ms 16236 KB Output is correct
17 Correct 300 ms 16108 KB Output is correct
18 Correct 289 ms 16236 KB Output is correct
19 Correct 286 ms 16108 KB Output is correct
20 Correct 280 ms 16108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1484 ms 16236 KB Output is correct
2 Correct 1503 ms 16236 KB Output is correct
3 Correct 1505 ms 16140 KB Output is correct
4 Correct 1508 ms 16108 KB Output is correct
5 Correct 1490 ms 16140 KB Output is correct
6 Correct 1459 ms 16108 KB Output is correct
7 Correct 1461 ms 16108 KB Output is correct
8 Correct 1442 ms 16236 KB Output is correct
9 Correct 1405 ms 16236 KB Output is correct
10 Correct 1398 ms 16236 KB Output is correct
11 Correct 1399 ms 16140 KB Output is correct
12 Correct 1418 ms 16140 KB Output is correct
13 Correct 1450 ms 16236 KB Output is correct
14 Correct 1462 ms 16140 KB Output is correct
15 Correct 1453 ms 16108 KB Output is correct
16 Correct 269 ms 16236 KB Output is correct
17 Correct 300 ms 16108 KB Output is correct
18 Correct 289 ms 16236 KB Output is correct
19 Correct 286 ms 16108 KB Output is correct
20 Correct 280 ms 16108 KB Output is correct
21 Incorrect 416 ms 16108 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 107 ms 16108 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1484 ms 16236 KB Output is correct
2 Correct 1503 ms 16236 KB Output is correct
3 Correct 1505 ms 16140 KB Output is correct
4 Correct 1508 ms 16108 KB Output is correct
5 Correct 1490 ms 16140 KB Output is correct
6 Correct 1459 ms 16108 KB Output is correct
7 Correct 1461 ms 16108 KB Output is correct
8 Correct 1442 ms 16236 KB Output is correct
9 Correct 1405 ms 16236 KB Output is correct
10 Correct 1398 ms 16236 KB Output is correct
11 Correct 1399 ms 16140 KB Output is correct
12 Correct 1418 ms 16140 KB Output is correct
13 Correct 1450 ms 16236 KB Output is correct
14 Correct 1462 ms 16140 KB Output is correct
15 Correct 1453 ms 16108 KB Output is correct
16 Correct 269 ms 16236 KB Output is correct
17 Correct 300 ms 16108 KB Output is correct
18 Correct 289 ms 16236 KB Output is correct
19 Correct 286 ms 16108 KB Output is correct
20 Correct 280 ms 16108 KB Output is correct
21 Incorrect 416 ms 16108 KB Output isn't correct
22 Halted 0 ms 0 KB -