제출 #584412

#제출 시각아이디문제언어결과실행 시간메모리
584412drdilyorSkyscraper (JOI16_skyscraper)C++17
0 / 100
260 ms524288 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/detail/standard_policies.hpp> #ifdef ONPC #include "t_debug.cpp" #else #define debug(...) 42 #endif #define allit(a) (a).begin(), (a).end() #define sz(a) ((int) (a).size()) #define cut(s) {cout << s << '\n'; return 0;} using namespace std; using ll = long long; using vi = vector<int>; namespace pd = __gnu_pbds; template<typename K> using ordered_set = pd::tree<K, pd::null_type, less<K>, pd::rb_tree_tag, pd::tree_order_statistics_node_update>; template<typename... T> using hash_table = pd::gp_hash_table<T...>; const int INF = 1e9; const ll INFL = 1e18; const int N = 14; const int L = 1000; const int MOD = 1e9+7; const int RANDOM = chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rng(RANDOM); int solve() { int n, l; cin >> n >> l; vi a(n); for (auto& i : a) cin >> i; sort(allit(a)); size_t size = (1<<N) * (N+1) * L+10; ll* memo = new ll[size]; memset(memo, -1, sizeof(ll) * size); function<ll(int, int, int)> dp = [&](int used, int l, int prev)->ll { int key = (used * N + (prev+1)) * L + l; if (memo[key] != -1) return memo[key]; if (used == (1 << n)-1) return 1; ll res = 0; for (int i = 0; i < n; i++) { if (used & (1<<i)) continue; int cost = prev == -1 ? 0 : abs(a[prev] - a[i]); if (cost > l) continue; res = (res + dp(used | (1 << i), l - cost, i)) % MOD; } return memo[key] = res; }; cout << dp(0, l, -1); return 0; } signed main() { cin.tie(0)->sync_with_stdio(0); int t = 1; //cin >> t; while (t-- && cin) { if (solve()) break; #ifdef ONPC cout << "____________________" << endl; #endif } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...