Submission #38145

#TimeUsernameProblemLanguageResultExecution timeMemory
38145funcsrSkyscraper (JOI16_skyscraper)C++14
20 / 100
1293 ms194144 KiB
#include <iostream> #include <string> #include <vector> #include <queue> #include <set> #include <cassert> #include <algorithm> #define rep(i,n) for (int i=0; i<(n); i++) #define all(x) x.begin(), x.end() using namespace std; #define INF 1145141919 #define MOD 1000000007 inline void add(int &x, int v) { x += v; if (x >= MOD) x -= MOD; } int N, L; int A[100]; //#define MAX_L 2800 #define MAX_L 1500 int dp[2][1<<14][MAX_L+1]; int main() { cin >> N >> L; if (N > 14) abort(); rep(i, N) cin >> A[i]; sort(A, A+N, greater<int>()); int lo = A[N-1], hi = A[0]; if (hi-lo > L) { cout << 0 << "\n"; return 0; } rep(i, N) A[i] -= lo; dp[0][0][0] = 1; rep(i, N) { rep(j, 1<<N) rep(k, MAX_L+1) dp[1][j][k] = 0; rep(S, 1<<N) { if (__builtin_popcount(S) != i) continue; rep(pos, N) { if ((S>>pos)&1) continue; int left = 0, right = 0; if (pos > 0) left = ((S>>(pos-1))&1) ? -1 : 1; if (pos+1 < N) right = ((S>>(pos+1))&1) ? -1 : 1; int e = A[i]*(left+right); int nS = S|(1<<pos); for (int k=max(-e, 0); k+e<=MAX_L; k++) { add(dp[1][nS][k+e], dp[0][S][k]); } } } swap(dp[0], dp[1]); } int s = 0; rep(i, L+1) add(s, dp[0][(1<<N)-1][i]); cout << s << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...