Submission #381704

#TimeUsernameProblemLanguageResultExecution timeMemory
381704Barbosa1998Skyscraper (JOI16_skyscraper)C++17
100 / 100
398 ms163808 KiB
#include <bits/stdc++.h> using namespace std; template <typename A, typename B> string to_string(pair<A, B> p); template <typename A, typename B, typename C> string to_string(tuple<A, B, C> p); template <typename A, typename B, typename C, typename D> string to_string(tuple<A, B, C, D> p); string to_string(const string& s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); } string to_string(vector<bool> v) { bool first = true; string res = "{"; for (int i = 0; i < static_cast<int>(v.size()); i++) { if (!first) { res += ", "; } first = false; res += to_string(v[i]); } res += "}"; return res; } template <size_t N> string to_string(bitset<N> v) { string res = ""; for (size_t i = 0; i < N; i++) { res += static_cast<char>('0' + v[i]); } return res; } template <typename A> string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template <typename A, typename B, typename C> string to_string(tuple<A, B, C> p) { return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ")"; } template <typename A, typename B, typename C, typename D> string to_string(tuple<A, B, C, D> p) { return "(" + to_string(get<0>(p)) + ", " + to_string(get<1>(p)) + ", " + to_string(get<2>(p)) + ", " + to_string(get<3>(p)) + ")"; } void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); } #ifdef LOCAL #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif #define fi first #define se second #define pb push_back #define mod(n,k) ( ( ((n) % (k)) + (k) ) % (k)) #define forn(i,a,b) for(int i = a; i < b; i++) #define forr(i,a,b) for(int i = a; i >= b; i--) #define all(x) (x).begin(), (x).end() typedef long long ll; typedef long double ld; typedef pair<int,int> ii; typedef vector<int> vi; typedef vector<ii> vii; const ll mod = 1e9+7; int sum(int a, int b){return (a+b) % mod;} int sub(int a, int b){return (a + mod - b) % mod;} int mul(int a, int b){return (1ll * a * b) % mod;} int power(int a,int b){ int res = 1; while(b){ if(b&1)res = mul(res,a); b >>= 1; a = mul(a,a); } return res; } const int maxn = 102; const int maxc = 1002; int A[maxn],memo[maxn][maxc][2][maxn][2],N,L; int dp(int pos,int cost,int l,int m,int r){ int newCost = cost; if(pos)newCost += (l+2*m+r)*(A[pos]-A[pos-1]); if(newCost > L)return 0; if(pos == N-1)return (m == 0); int &res = memo[pos][cost][l][m][r]; if(res != -1)return res; res = 0; res = sum(res,dp(pos+1,newCost,1,m,r)); if(m)res = sum(res,mul(m,dp(pos+1,newCost,1,m-1,r))); res = sum(res,dp(pos+1,newCost,l,m,1)); if(m)res = sum(res,mul(m,dp(pos+1,newCost,l,m-1,1))); res = sum(res,dp(pos+1,newCost,l,m+1,r)); if(m >= 1)res = sum(res,mul(2*m,dp(pos+1,newCost,l,m,r))); if(m >= 2)res = sum(res,mul(m*(m-1),dp(pos+1,newCost,l,m-1,r))); return res; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); forn(i,0,maxn)forn(j,0,maxc)forn(k,0,2)forn(l,0,maxn)forn(m,0,2)memo[i][j][k][l][m] = -1; cin >> N >> L; forn(i,0,N)cin >> A[i]; sort(A,A+N); int res = dp(0,0,0,0,0); cout << res << '\n'; return 0; } /* __builtin_mul_overflow(x,y,&x) -fsplit-stack */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...