Submission #988436

#TimeUsernameProblemLanguageResultExecution timeMemory
988436GrindMachineSkyscraper (JOI16_skyscraper)C++17
100 / 100
563 ms347016 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long int ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL) #define pb push_back #define endl '\n' #define sz(a) (int)a.size() #define setbits(x) __builtin_popcountll(x) #define ff first #define ss second #define conts continue #define ceil2(x,y) ((x+y-1)/(y)) #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define yes cout << "Yes" << endl #define no cout << "No" << endl #define rep(i,n) for(int i = 0; i < n; ++i) #define rep1(i,n) for(int i = 1; i <= n; ++i) #define rev(i,s,e) for(int i = s; i >= e; --i) #define trav(i,a) for(auto &i : a) template<typename T> void amin(T &a, T b) { a = min(a,b); } template<typename T> void amax(T &a, T b) { a = max(a,b); } #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif /* refs: https://usaco.guide/problems/joi-2016skyscraper/solution read it long back, recollected the ideas from there when solving the problem */ const int MOD = 1e9 + 7; const int N = 1e5 + 5; const int inf1 = int(1e9) + 5; const ll inf2 = ll(1e18) + 5; void solve(int test_case) { ll n,m; cin >> n >> m; vector<ll> a(n+5); rep1(i,n) cin >> a[i]; sort(a.begin()+1,a.begin()+n+1); a[n+1] = inf1; if(n == 1){ cout << 1 << endl; return; } ll dp[n+5][n+5][m+5][2][2]; memset(dp,0,sizeof dp); dp[1][0][0][0][0] = 1; rep1(i,n){ ll d = a[i+1]-a[i]; rep(j,n+1){ rep(k,m+1){ rep(x,2){ rep(y,2){ dp[i][j][k][x][y] %= MOD; ll val = dp[i][j][k][x][y]; // new { ll spaces = 2*(j+1)-x-y; ll k2 = k+spaces*d; if(k2 >= 0 and k2 <= m){ dp[i+1][j+1][k2][x][y] += val; } } // connect to 1 comp { ll spaces = 2*j-x-y; ll k2 = k+spaces*d; if(k2 >= 0 and k2 <= m){ dp[i+1][j][k2][x][y] += val*spaces; } } // connect to 2 comps { ll spaces = 2*(j-1)-x-y; ll k2 = k+spaces*d; if(k2 >= 0 and k2 <= m){ ll ways = 0; // both non-spl ways += (j-x-y)*(j-x-y-1); amax(ways,0ll); // x if(x){ ways += j-1; } // y if(y){ ways += j-1; } // x and y if(x and y){ if(i == n) ways--; else ways -= 2; } dp[i+1][j-1][k2][x][y] += val*ways; } } // left end if(!x){ // new { ll spaces = 2*(j+1)-(x|1)-y; ll k2 = k+spaces*d; if(k2 >= 0 and k2 <= m){ dp[i+1][j+1][k2][x|1][y] += val; } } // connect to 1 comp { ll spaces = 2*j-(x|1)-y; ll k2 = k+spaces*d; ll ways = j; if(y and i != n) ways--; if(k2 >= 0 and k2 <= m){ dp[i+1][j][k2][x|1][y] += val*ways; } } } // right end if(!y){ // new { ll spaces = 2*(j+1)-x-(y|1); ll k2 = k+spaces*d; if(k2 >= 0 and k2 <= m){ dp[i+1][j+1][k2][x][y|1] += val; } } // connect to 1 comp { ll spaces = 2*j-x-(y|1); ll k2 = k+spaces*d; ll ways = j; if(x and i != n) ways--; if(k2 >= 0 and k2 <= m){ dp[i+1][j][k2][x][y|1] += val*ways; } } } } } } } } ll ans = 0; rep(k,m+1){ ans += dp[n+1][1][k][1][1]; } ans %= MOD; cout << ans << endl; } int main() { fastio; int t = 1; // cin >> t; rep1(i, t) { solve(i); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...