Submission #268713

#TimeUsernameProblemLanguageResultExecution timeMemory
268713test2Boat (APIO16_boat)C++14
9 / 100
1446 ms28024 KiB
#include<bits/stdc++.h> #define I inline void using ll = long long ; using ld = long double ; using namespace std ; const int N = 3000 + 7 , mod = 1e9 + 7 ; // how interesting! int n; ll ans ; map<int , int > used ; set<pair<int , int> > st ; ll sz[N] ; vector<pair<int , int> > v ; ll f[N] ; I add(int u , int v){ while(u <=v && used[u])u++ ; while(v>=u&&used[v])v-- ; if(u <=v){ used[u] = used[v] = 1; st.insert({u , v}) ; } } vector<int> onepiece[N * 10] ; std::vector<int> szs[N * 10]; ll dp[N][505] ; ll mul(ll a , ll b){ return (1ll * a * b) %mod ; } ll faspow(ll x , ll y){ if(!y)return 1ll ; ll ret = faspow(x , y/2) ; ret = (1ll * ret * ret ) %mod ; if(y&1)ret = 1ll * ret * x %mod ; return ret ; } ll ncr(ll x , ll y){ ll ret = mul(f[x] , faspow(f[y] , mod -2)) ; ret = mul(ret , faspow(f[x - y] , mod-2)) ; return ret ; } ll solve(int i , int j){ if(dp[i][j]!=-1) return dp[i][j] ; if(i == (int) st.size()) return 1; ll ret = solve(i+1 , j ) ; int pos = 0 ; ll add = 0ll ; int k = 0 ; for(auto u : onepiece[i]){ if(u > j){ if( k +1 <= sz[i]) add = (add + ncr(sz[i] , min((int) sz[i] , ++ k ) ) ) %mod ; ll plls = mul( add , solve(i+1, u) ) ; ret = (ret + plls ) %mod ; } pos ++ ; } return dp[i][j] = ret ; } ll conts[N] ; int main(){ ios_base::sync_with_stdio(0) ; cin.tie(0) ; memset(dp , -1 , sizeof dp) ; f[0] = 1ll ; for(int i =1 ; i < N ;i++){ f[i]= mul(f[i-1] , i) ; } //freopen("in.in" , "r" , stdin) ; cin >> n; set<int> ev ; for(int i = 0 ;i < n;i++){ int x , y ; cin >> x >> y ; ev.insert(x) ; ev.insert(y) ; used[x] = used[y] = 1; st.insert({x , x}) ; st.insert({y , y}) ; //for(int j =x ;j <= y ;j ++) // st.push_back({j , j}) ; v.push_back({x , y}) ; } int l = 0 ; for(auto u : ev){ if(l){ add(l+1 , u - 1) ; } l = u ; } int pos = 0 ; for(auto u : st){ for(int j = 0 ;j < n; j++){ if( u.first>= v[j].first && u.second <= v[j].second ){ onepiece[pos].push_back(j + 1) ; szs[pos].push_back( u.second - u.first +1 ) ; sz[pos] += u.second - u.first + 1ll ; conts[j] += u.second - u.first + 1 ; } } sz[pos] = u.second - u.first + 1 ; sort(onepiece[pos].begin() , onepiece[pos].end()) ; pos ++ ; } for(int i = 0 ;i < n;i++){ // assert((conts[i] == v[i].second - v[i].first + 1)) ; } cout<< (mod + solve(0 , 0 ) -1 ) %mod ; return 0 ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...