답안 #557717

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
557717 2022-05-06T00:51:11 Z hhhhaura Boat (APIO16_boat) C++14
36 / 100
2000 ms 18144 KB
#define wiwihorz
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse")
#pragma loop-opt(on)
#define rep(i, a, b) for(int i = a; i <= b; i ++)
#define rrep(i, a, b) for(int i = b; i >= a; i --)
#define all(x) x.begin(), x.end()
#define ceil(a, b) ((a + b - 1) / (b))
#define int long long int
#define lld long double
#define pii pair<int, int>
#define random mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count())
#define INF 1000000000000000000
#define MOD 1000000007
#define eps (1e-9)
using namespace std;
#ifdef wiwihorz
#define print(a...)cerr<<"Line "<<__LINE__<<":",kout("["+string(#a)+"] = ", a)
void vprint(auto L,auto R){while(L<R)cerr<<*L<<" \n"[next(L) == R], ++L; }
void kout() { cerr << endl; }
template<class T1,class ... T2>void kout(T1 a,T2 ... e){cerr<<a<<" ",kout(e...);}
#else
#define print(...) 0
#define vprint(...) 0
#endif
#define x first
#define y second
namespace solver {
	int n, tot;
	vector<pii> seg;
	vector<int> v, fac, inv;
	vector<vector<int>> dp, pre, P, cal, C;
	int pow_(int a, int times) {
		int ans = 1;
		for(; times > 0; times >>= 1, a = a * a % MOD) {
			if(times & 1) ans = ans * a % MOD;
		}
		return ans;
	}
	void init_(int _n) {
		n = _n;
		v.clear();
		seg.assign(n + 1, {0, 0});
		dp.assign(n + 1, vector<int>(n * 2 + 1, 0));
		pre.assign(n * 2 + 1, vector<int>(n + 1, 0));
		P.assign(n * 2 + 1, vector<int>(n + 1, 0));
		C.assign(n + 1, vector<int>(n + 1, 0));
		cal.assign(n * 2 + 1, vector<int>(n + 1, 0));
		fac.assign(n + 1, 1);
		inv.assign(n + 1, 1);
		rep(i, 1, n) fac[i] = fac[i - 1] * i % MOD;
		inv[n] = pow_(fac[n], MOD - 2);
		rrep(i, 1, n - 1) inv[i] = inv[i + 1] * (i + 1) % MOD;
		rep(i, 0, n) rep(j, 0, i) {
			C[i][j] = fac[i] * inv[j] % MOD * inv[i - j] % MOD;
		}
	}

	void solve() {
		sort(all(v));
		v.resize(unique(all(v)) - v.begin());
		tot = v.size() - 1;
		rep(i, 1, n) {
			int L = seg[i].x, R = seg[i].y;
			L = lower_bound(all(v), L) - v.begin() + 1;
			R = lower_bound(all(v), R + 1) - v.begin();
			seg[i] = {L, R};
		}
		vector<int> a, b;
		rep(i, 1, signed(v.size()) - 1) a.push_back(v[i] - v[i - 1]);
		sort(all(a)), a.resize(unique(all(a)) - a.begin());
		int l = 0, cur = 1;
		rep(i, 1, 1000000000) {
			cur = cur * i % MOD;
			if(a[l] == i) {
				b.push_back(cur), l++;
				if(l == a.size()) break;
			}
		}
		rep(i, 1, tot) {
			int len = v[i] - v[i - 1];
			int id = lower_bound(all(a), len) - a.begin();
			rep(j, 1, n) {
				int cur = 1;
				rep(k, 0, j - 1) cur = cur * (len - k) % MOD;
				cur = pow_(b[id], MOD - 2) * cur % MOD;
				if(len < j) P[i][j] = 0;
				else P[i][j] = b[id] * cur % MOD * inv[j] % MOD;
			}
		}
		rep(i, 1, tot) rep(j, 1, n) {
			rep(k, 1, j) {
				cal[i][j] += P[i][k] * C[j - 1][k - 1] % MOD;
				cal[i][j] %= MOD;
			}
		}
		dp[0][0] = 1;
		rep(i, 0, tot) pre[i][0] = 1;
		rep(i, 1, n) {
			int L = seg[i].x, R = seg[i].y;
			rep(j, 1, tot) if(L <= j && j <= R) {
				int cnt = 0;
				rrep(k, 0, i - 1) {
					cnt += (seg[k + 1].x <= j && seg[k + 1].y >= j);
					dp[i][j] += pre[j - 1][k] * cal[j][cnt] % MOD;
					dp[i][j] %= MOD;
				}
			}
			rep(j, 1, tot) pre[j][i] = (pre[j - 1][i] + dp[i][j]) % MOD;
		}
		int ans = 0;
		rep(i, 1, n) ans = (ans + pre[tot][i]) % MOD;
		cout << ans << "\n";
	}
	
};
using namespace solver;
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	int n; cin >> n;
	init_(n);
	rep(i, 1, n) {
		cin >> seg[i].x >> seg[i].y;
		v.push_back(seg[i].x);
		v.push_back(seg[i].y + 1);
	}
	solve();
	return 0;
}

Compilation message

boat.cpp:5: warning: ignoring '#pragma loop ' [-Wunknown-pragmas]
    5 | #pragma loop-opt(on)
      | 
boat.cpp:20:13: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   20 | void vprint(auto L,auto R){while(L<R)cerr<<*L<<" \n"[next(L) == R], ++L; }
      |             ^~~~
boat.cpp:20:20: warning: use of 'auto' in parameter declaration only available with '-fconcepts-ts'
   20 | void vprint(auto L,auto R){while(L<R)cerr<<*L<<" \n"[next(L) == R], ++L; }
      |                    ^~~~
boat.cpp: In function 'void solver::solve()':
boat.cpp:78:10: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     if(l == a.size()) break;
      |        ~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1445 ms 18136 KB Output is correct
2 Correct 1441 ms 18136 KB Output is correct
3 Correct 1439 ms 18132 KB Output is correct
4 Correct 1489 ms 18140 KB Output is correct
5 Correct 1609 ms 18056 KB Output is correct
6 Correct 1395 ms 18136 KB Output is correct
7 Correct 1524 ms 18132 KB Output is correct
8 Correct 1414 ms 18136 KB Output is correct
9 Correct 1467 ms 18132 KB Output is correct
10 Correct 1609 ms 18140 KB Output is correct
11 Correct 1818 ms 18136 KB Output is correct
12 Correct 1670 ms 18140 KB Output is correct
13 Correct 1637 ms 18136 KB Output is correct
14 Correct 1648 ms 18140 KB Output is correct
15 Correct 1441 ms 18136 KB Output is correct
16 Correct 684 ms 18132 KB Output is correct
17 Correct 778 ms 18132 KB Output is correct
18 Correct 785 ms 18132 KB Output is correct
19 Correct 605 ms 18132 KB Output is correct
20 Correct 768 ms 18132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1445 ms 18136 KB Output is correct
2 Correct 1441 ms 18136 KB Output is correct
3 Correct 1439 ms 18132 KB Output is correct
4 Correct 1489 ms 18140 KB Output is correct
5 Correct 1609 ms 18056 KB Output is correct
6 Correct 1395 ms 18136 KB Output is correct
7 Correct 1524 ms 18132 KB Output is correct
8 Correct 1414 ms 18136 KB Output is correct
9 Correct 1467 ms 18132 KB Output is correct
10 Correct 1609 ms 18140 KB Output is correct
11 Correct 1818 ms 18136 KB Output is correct
12 Correct 1670 ms 18140 KB Output is correct
13 Correct 1637 ms 18136 KB Output is correct
14 Correct 1648 ms 18140 KB Output is correct
15 Correct 1441 ms 18136 KB Output is correct
16 Correct 684 ms 18132 KB Output is correct
17 Correct 778 ms 18132 KB Output is correct
18 Correct 785 ms 18132 KB Output is correct
19 Correct 605 ms 18132 KB Output is correct
20 Correct 768 ms 18132 KB Output is correct
21 Correct 1487 ms 18140 KB Output is correct
22 Correct 1418 ms 18136 KB Output is correct
23 Correct 1403 ms 18136 KB Output is correct
24 Correct 1416 ms 18136 KB Output is correct
25 Correct 1429 ms 18132 KB Output is correct
26 Correct 1462 ms 18136 KB Output is correct
27 Correct 1489 ms 18136 KB Output is correct
28 Correct 1459 ms 18132 KB Output is correct
29 Correct 1466 ms 18144 KB Output is correct
30 Execution timed out 2081 ms 18132 KB Time limit exceeded
31 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 260 ms 1048 KB Output is correct
2 Correct 261 ms 1044 KB Output is correct
3 Correct 302 ms 980 KB Output is correct
4 Correct 275 ms 1048 KB Output is correct
5 Correct 257 ms 1048 KB Output is correct
6 Correct 167 ms 1052 KB Output is correct
7 Correct 129 ms 1068 KB Output is correct
8 Correct 150 ms 1060 KB Output is correct
9 Correct 139 ms 1048 KB Output is correct
10 Correct 208 ms 1060 KB Output is correct
11 Correct 192 ms 1040 KB Output is correct
12 Correct 190 ms 1048 KB Output is correct
13 Correct 182 ms 1052 KB Output is correct
14 Correct 373 ms 1052 KB Output is correct
15 Correct 207 ms 1052 KB Output is correct
16 Correct 368 ms 980 KB Output is correct
17 Correct 409 ms 1048 KB Output is correct
18 Correct 504 ms 1048 KB Output is correct
19 Correct 485 ms 1040 KB Output is correct
20 Correct 518 ms 1048 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1445 ms 18136 KB Output is correct
2 Correct 1441 ms 18136 KB Output is correct
3 Correct 1439 ms 18132 KB Output is correct
4 Correct 1489 ms 18140 KB Output is correct
5 Correct 1609 ms 18056 KB Output is correct
6 Correct 1395 ms 18136 KB Output is correct
7 Correct 1524 ms 18132 KB Output is correct
8 Correct 1414 ms 18136 KB Output is correct
9 Correct 1467 ms 18132 KB Output is correct
10 Correct 1609 ms 18140 KB Output is correct
11 Correct 1818 ms 18136 KB Output is correct
12 Correct 1670 ms 18140 KB Output is correct
13 Correct 1637 ms 18136 KB Output is correct
14 Correct 1648 ms 18140 KB Output is correct
15 Correct 1441 ms 18136 KB Output is correct
16 Correct 684 ms 18132 KB Output is correct
17 Correct 778 ms 18132 KB Output is correct
18 Correct 785 ms 18132 KB Output is correct
19 Correct 605 ms 18132 KB Output is correct
20 Correct 768 ms 18132 KB Output is correct
21 Correct 1487 ms 18140 KB Output is correct
22 Correct 1418 ms 18136 KB Output is correct
23 Correct 1403 ms 18136 KB Output is correct
24 Correct 1416 ms 18136 KB Output is correct
25 Correct 1429 ms 18132 KB Output is correct
26 Correct 1462 ms 18136 KB Output is correct
27 Correct 1489 ms 18136 KB Output is correct
28 Correct 1459 ms 18132 KB Output is correct
29 Correct 1466 ms 18144 KB Output is correct
30 Execution timed out 2081 ms 18132 KB Time limit exceeded
31 Halted 0 ms 0 KB -