Submission #958114

#TimeUsernameProblemLanguageResultExecution timeMemory
958114thomas_liBoat (APIO16_boat)C++17
100 / 100
1253 ms37492 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define int ll
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define PB push_back
#define FS first
#define SD second
#define ary(k) array<int,k>
template<class A,class B> void cmx(A& x, B y) {x=max<A>(x,y);}
template<class A,class B> void cmn(A& x, B y) {x=min<A>(x,y);}
typedef pair<int, int> pii;
typedef vector<int> vi;
const int MM = 1e3+20,MOD = 1e9+7;

typedef int T;
int n; T dp[MM][MM]; vi pts; vector<pii> grps;
pii school[MM]; int lft[MM],rit[MM];
T big_c[MM][MM];

T pre[MM][2][MM],C[MM][MM];
int fpow(int x, int y){
	int res = 1;
	while(y){
		if(y & 1) res = 1ll*res*x%MOD;
		x = 1ll*x*x%MOD;
		y /= 2;
	}
	return res;
}
signed main() {
	cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit);
    C[0][0] = 1;
    rep(i,1,MM){
        rep(j,0,i+1){
            C[i][j] = C[i-1][j];
            if(j) C[i][j] = (C[i][j]+C[i-1][j-1])%MOD;
        }
    }
    cin >> n;
    rep(i,1,n+1){
        int a,b; cin >> a >> b;
        school[i] = {a,b};
        pts.PB(a-1);
        pts.PB(b);
    }
    pts.PB(-1);
    sort(all(pts));     
    rep(i,0,sz(pts)-1){
        if(pts[i] < pts[i+1]) grps.PB({pts[i]+1,pts[i+1]});
    }
    int m = sz(grps);
    rep(i,1,n+1){
        auto[a,b] = school[i];
        lft[i] = -1;
        rep(j,0,m){
            auto[l,r] = grps[j];
            if(a <= l && r <= b){
                rit[i] = j;
                if(!~lft[i]) lft[i] = j;
            }
        }
        assert(~lft[i]);
    } 
    rep(j,0,m){
        dp[0][j] = 1;
    }
    
    auto fC = [&](int x, int y){
        if(x < 0 || x < y || y < 0) return T(0);
        return C[x][y];
    };
    rep(i,1,m){
        int len = grps[i].SD-grps[i].FS+1;
        T kf = 1,num = 1;
        rep(j,1,min(len+1,n+1)){
            num = num*(len-j+1)%MOD;
            kf = kf*j%MOD;
            big_c[i][j] = num*fpow(kf,MOD-2)%MOD;
        }
    } 
    assert(m <= 1010);
    rep(j,1,m){
        rep(p,0,2) rep(num,1,n+1){
            T cur = 0;
            rep(l,1+p,num+1){
                cur = (cur+fC(num-1-p,l-1-p)*big_c[j][l]%MOD)%MOD;
            } 
            pre[j][p][num] = cur;
        } 
    }
    
    T ans = 0; 
    rep(i,1,n+1){
        rep(j,lft[i],rit[i]+1){
            // fix first one we use same group j
            int num_with = 0;
            for(int k = i; k >= 1; k--)if(lft[k] <= j && j <= rit[k]){
                num_with++;
                dp[i][j] = (dp[i][j]+pre[j][k!=i][num_with]*dp[k-1][j-1]%MOD)%MOD;
            }
            ans = (ans+dp[i][j])%MOD;
        }
        // build psa
        rep(j,1,m){
            dp[i][j] = (dp[i][j]+dp[i][j-1])%MOD;
        }
        rep(j,0,m){
            dp[i][j] = (dp[i][j]+dp[i-1][j])%MOD;
        }
    }
    cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...