Submission #102823

#TimeUsernameProblemLanguageResultExecution timeMemory
102823Noam527Bali Sculptures (APIO15_sculpture)C++17
100 / 100
99 ms8568 KiB
#include <bits/stdc++.h> #define CHECK cout << "ok" << endl #define finish(x) return cout << x << endl, 0 typedef long long ll; typedef long double ldb; const int md = 1e9 + 7; const ll inf = 1e18; const int OO = 1; const int OOO = 1; using namespace std; int n, lo, hi; vector<int> a; int dp[2002][2002]; ll b = 0; bool good(ll sum) { return (sum & b) == 0; } bool can1() { ll sum = 0; for (int i = 0; i < n; i++) sum += a[i], dp[i][1] = good(sum); for (int j = 2; j <= hi; j++) { for (int i = j - 1; i < n; i++) { dp[i][j] = 0; sum = 0; for (int k = i; !dp[i][j] && k >= j - 1; k--) { sum += a[k]; if (good(sum) && dp[k - 1][j - 1]) dp[i][j] = 1; } } } for (int i = lo; i <= hi; i++) if (dp[n - 1][i]) return true; return false; } bool can2() { ll sum; for (int i = 0; i < n; i++) { dp[i][0] = md; sum = 0; for (int j = i; j > 0; j--) { sum += a[j]; if (good(sum)) dp[i][0] = min(dp[i][0], dp[j - 1][0] + 1); } sum += a[0]; if (good(sum)) dp[i][0] = 1; } return dp[n - 1][0] <= hi; } int main() { ios::sync_with_stdio(0), cin.tie(0); cin >> n >> lo >> hi; a.resize(n); ll sum = 0, add = 1, ans = 0; for (auto &i : a) cin >> i, sum += i; while (add <= sum) add *= 2; add /= 2; while (add >= 1) { b ^= add; if (lo > 1) { if (!can1()) { b ^= add; ans += add; } } else { if (!can2()) { b ^= add; ans += add; } } add /= 2; } finish(ans); }
#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...