이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)
const int MX_N = 505;
const int MOD = 1e9+7;
int N, A[MX_N], B[MX_N];
vector<int> val;
int inv[MX_N];
int f[MX_N][2*MX_N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N;
FOR(i,1,N){
cin >> A[i] >> B[i];
B[i] += 1;
val.push_back(A[i]);
val.push_back(B[i]);
}
sort(ALL(val));
val.resize(unique(ALL(val))-val.begin());
FOR(i,1,N){
A[i] = lower_bound(ALL(val),A[i])-val.begin();
B[i] = lower_bound(ALL(val),B[i])-val.begin();
}
inv[1] = 1; FOR(i,2,N) inv[i] = (long long) (MOD-MOD/i) * inv[MOD%i] % MOD;
FOR(p,0,SZ(val)-1) f[N+1][p] = 1;
FOR(i,1,N) f[i][SZ(val)] = 0;
RFOR(p,SZ(val)-2,0){
int lp = val[p+1]-val[p];
RFOR(i,N,1){
f[i][p] = 0;
if (p < SZ(val)-1) f[i][p] = (f[i][p] + f[i][p+1]) % MOD;
if (A[i] <= p && p < B[i]) {
int m = 0;
int g = lp;
FOR(j,i+1,N+1){
f[i][p] = (f[i][p] + (long long) g * f[j][p+1] % MOD) % MOD;
if (A[j] <= p && p < B[j]) {
++m;
g = (long long) g * (m + lp) % MOD * inv[m+1] % MOD;
}
}
}
//TRACE(i _ p _ f[i][p]);
}
}
int ans = 0;
FOR(i,1,N) ans = (ans + f[i][0]) % MOD;
cout << ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |