Submission #884584

#TimeUsernameProblemLanguageResultExecution timeMemory
884584AnhPhamBali Sculptures (APIO15_sculpture)C++17
46 / 100
16 ms3796 KiB
#include <bits/stdc++.h> #ifdef OP_DEBUG #include <algo/debug.h> #else #define debug(...) 26 #endif using namespace std; #define int long long // maybe tle? #define sz(v) (int)(v).size() #define all(v) (v).begin(), (v).end() #define TcT template <class T const int MOD = (int)1e9 + 7, INF = (int)2e9 + 9, INF64 = (int)4e18 + 18; TcT> bool minimize(T &lhs, const T &rhs) { return rhs < lhs ? lhs = rhs, 1 : 0; } TcT> bool maximize(T &lhs, const T &rhs) { return rhs > lhs ? lhs = rhs, 1 : 0; } TcT, class S> istream &operator >> (istream &scanf, pair <T, S> &u) { return scanf >> u.first >> u.second; } TcT, class S> ostream &operator << (ostream &print, pair <T, S> &u) { return print << u.first << ' ' << u.second; } void solve(); int32_t main() { cin.tie(nullptr), cout.tie(nullptr) -> sync_with_stdio(0); int testcases = 1; #define TC 0 if (TC) { cin >> testcases; } for (; testcases--;) { solve(); } } /* [Pham Hung Anh - 11I - Tran Hung Dao High School for Gifted Student] */ const int N = 2002; int n, a, b; int y[N]; namespace sub1 { int ans = INF64; void Try(int k, int parts, int sum, int sum_or) { if (k > n) { if (a <= parts && parts <= b) minimize(ans, sum_or | sum); return; } Try(k + 1, parts, sum + y[k], sum_or); Try(k + 1, parts + 1, y[k], sum_or | sum); } void solve() { Try(2, 1, y[1], 0); cout << ans << '\n'; } } namespace sub2 { bool dp[55][22][505]; void solve() { dp[0][0][0] = 1; for (int i = 1; i <= n; ++i) for (int parts = 0; parts <= b; ++parts) for (int sum_or = 0; sum_or <= 500; ++sum_or) { int sum = 0; for (int j = i; j >= 1; --j) dp[i][parts + 1][sum_or | (sum += y[j])] |= dp[j - 1][parts][sum_or]; } int ans = INF64; for (int parts = a; parts <= b; ++parts) for (int sum_or = 0; sum_or <= 500; ++sum_or) if (dp[n][parts][sum_or]) minimize(ans, sum_or); cout << ans << '\n'; } } namespace sub3 { int dp[101][2002]; void solve() { memset(dp, 0x3f, sizeof (dp)); dp[0][0] = 0; for (int i = 1; i <= n; ++i) for (int sum_or = 0; sum_or <= 2000; ++sum_or) { int sum = 0; for (int j = i; j >= 1; --j) minimize(dp[i][sum_or | (sum += y[j])], dp[j - 1][sum_or] + 1); } int ans = INF64; for (int sum_or = 0; sum_or <= 2000; ++sum_or) if (dp[n][sum_or] <= b) minimize(ans, sum_or); cout << ans << '\n'; } } namespace sub4 { void solve() { } } void solve() { cin >> n >> a >> b; for (int i = 1; i <= n; ++i) cin >> y[i]; if (n <= 20) sub1 :: solve(); else if (n <= 50) sub2 :: solve(); else if (n <= 100 && a == 1) sub3 :: solve(); else if (n <= 100) sub4 :: solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...