Submission #653386

#TimeUsernameProblemLanguageResultExecution timeMemory
653386uroskBoat (APIO16_boat)C++14
0 / 100
82 ms13244 KiB
#define here cerr<<"===========================================\n" #define dbg(x) cerr<<#x<<": "<<x<<endl; #include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> #define ld double #define ll long long #define llinf 100000000000000000LL // 10^17 #define pb push_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pll pair<ll,ll> #define pld pair<ld,ld> #define sz(a) (ll)(a.size()) #define all(a) a.begin(),a.end() #define ceri(a,l,r) {cerr<<#a<<": ";for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;} #define cer(a) {cerr<<#a<<": ";for(ll x_ : a) cerr<<x_<< " ";cerr<<endl;} #define daj_mi_malo_vremena ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0); using namespace std; using namespace __gnu_pbds; #define mod 1000000007 ll add(ll x,ll y){ x+=y; if(x<0){ x%=mod; x+=mod; }else{ if(x>=mod) x%=mod; } return x; } ll mul(ll a,ll b){ ll ans = (a*b)%mod; if(ans<0) ans+=mod; return ans; } ll po(ll x,ll y){ if(y==0) return 1LL; ll ans = po(x,y/2); ans = mul(ans,ans); if(y&1) ans = mul(ans,x); return ans; } ll inv(ll x){return po(x,mod-2);} #define maxn 1005 ll n; pll a[maxn]; pll seg[maxn]; ll dp[maxn][maxn]; map<pll,ll> ch; ll cnt = 0; bool in(pll x,pll y){ return x.fi>=y.fi&&x.sc<=y.sc; } ll calc(ll n,ll k){ if(ch.count({n,k})){ //cerr<<"nk: " <<n<<" "<<k<< " "<<ch[{n,k}]<<endl; return ch[{n,k}]; } ch[{n,n}] = 1; ch[{n,0}] = 1; ll ans = 1; for(ll j = 1;j<min(n,1001LL);j++){ ans = mul(ans,n-j+1); ans = mul(ans,inv(j)); ch[{n,j}] = ans; } //cerr<<"nk: " <<n<<" "<<k<< " "<<ch[{n,k}]<<endl; return ch[{n,k}]; } void tc(){ cin >> n; set<ll> s; for(ll i = 1;i<=n;i++){ cin >> a[i].fi >> a[i].sc; s.insert(a[i].fi); s.insert(a[i].sc+1); } auto it = s.begin(); it++; while(it!=s.end()){ auto it2 = it; it2--; seg[++cnt] = {(*it2),(*it)-1}; it++; } //here; //for(ll i = 1;i<=cnt;i++) cerr<<seg[i].fi<<" "<<seg[i].sc<<endl; //here; dp[0][0] = 1; for(ll i = 1;i<=cnt;i++) dp[0][i] = 1; for(ll i = 1;i<=n;i++){ for(ll k = 1;k<=cnt;k++){ for(ll j = i;j>=1;j--){ if(!in(seg[k],a[j])) break; dp[i][k] = add(dp[i][k],mul(dp[j-1][k-1],calc(seg[k].sc-seg[k].fi+1,i-j+1))); if(j>=2) dp[i][k] = add(dp[i][k],mul(dp[j-2][k-1],calc(seg[k].sc-seg[k].fi+1,i-j))); } dp[i][k] = add(dp[i][k],dp[i][k-1]); if(i>=2) dp[i][k] = add(dp[i][k],dp[i-1][k-1]); } } //for(ll i = 1;i<=n;i++) ceri(dp[i],1,cnt); dp[n][cnt] = add(dp[n][cnt],-1); cout<<dp[n][cnt]<<endl; } int main(){ daj_mi_malo_vremena int t; t = 1; while(t--){ tc(); } 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...