Submission #108258

#TimeUsernameProblemLanguageResultExecution timeMemory
108258golubBali Sculptures (APIO15_sculpture)C++14
100 / 100
409 ms512 KiB
// #define TASK "sweets" // #pragma GCC optimize("Ofast") // #pragma GCC target("sse4.2,avx2") // #pragma GCC optimize("unroll-loops") // #pragma GCC optimize("unroll-all-loops") #include <bits/stdc++.h> // #include <ext/rope> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/detail/standard_policies.hpp> // using namespace __gnu_cxx;` // using namespace __gnu_pbds; using namespace std; // template<class K> // using ordered_set = tree<K, null_type, less<K>, rb_tree_tag, tree_order_statistics_node_update>; // template<class K, class T> // using ordered_map = tree<K, T, less<K>, rb_tree_tag, tree_order_statistics_node_update>; // mt19937 rnd((int)chrono::high_resolution_clock::now().time_since_epoch().count()); #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define F first #define S second #define pb push_back #define pii pair<int, int> #define len(x) (long long)x.size() #define int long long typedef long long ll; typedef long double ld; const long long INF = (int)numeric_limits<int>::max() >> 1; const long long MAXN = (long long)1e5 + 10; const long long MOD = (long long)1e9 + 7; const long double EPS = (long double)1e-12; // char _buf_[(int)6e6]; // size_t _p_ = 0; // inline void *operator new(size_t _n_) { // _p_ += _n_; // return _buf_ + _p_ - _n_; // } // inline void operator delete(void*) {}; ll power(ll x, ll n, ll mod = 1e9 + 7) { if (n == 0) return 1ll; if (n & 1ll) return power(x, n - 1ll, mod) * x % mod; ll tmp = power(x, n >> 1ll, mod); return (tmp * tmp) % mod; } ll gcd(ll a, ll b) { if (b == 0) return a; return gcd (b, a % b); } ll lcm(ll a, ll b) { return a / gcd(a, b) * b; } template<typename A, typename B> bool cmax(A &a, const B &b) { if (a < b) { a = b; return true; } return false; } template<typename A, typename B> bool cmin(A &a, const B &b) { if (a > b) { a = b; return true; } return false; } vector<int> y; int ans = 0; vector<int> pref; int getSUM(int l, int r) { if (l == 0) return pref[r]; return pref[r] - pref[l - 1]; } bool can(int bit, int a, int b) { vector<int> dp(len(y), INF); for (int i = 0; i < len(dp); i++) { for (int j = -1; j < i; j++) { if ((getSUM(j + 1, i) & (~ans)) < (1ll << bit)) { if (j == -1) dp[i] = cmin(dp[i], 1); else cmin(dp[i], dp[j] + 1); } } } return dp.back() <= b; } bool can2(int bit, int a, int b) { int n = len(y); vector<vector<int>> dp(n, vector<int>(n + 1, 0)); for (int i = 0; i < n; i++) { for (int j = -1; j < i; j++) { if ((getSUM(j + 1, i) & (~ans)) < (1ll << bit)) { if (j == -1) { dp[i][1] = 1; continue; } for (int k = 1; k <= n; k++) { dp[i][k] |= dp[j][k - 1]; } } } } for (int i = a; i <= b; i++) { if (dp.back()[i]) return 1; } return 0; } signed main() { #ifndef LOCAL #ifdef TASK freopen(TASK".in", "r", stdin); freopen(TASK".out", "w", stdout); #endif #endif iostream::sync_with_stdio(0); cin.tie(0); cout.tie(0); // == SOLUTION == // int n, a, b; cin >> n >> a >> b; y.resize(n); pref.resize(n); for (auto &x: y) cin >> x; pref[0] = y[0]; for (int i = 1; i < n; i++) { pref[i] = pref[i - 1] + y[i]; } for (int i = 60; i >= 0; i--) { if (a == 1) { if (!can(i, a, b)) { ans |= (1ll << i); } continue; } if (!can2(i, a, b)) { ans |= (1ll << i); } } cout << ans << "\n"; }
#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...