제출 #1302171

#제출 시각아이디문제언어결과실행 시간메모리
1302171NonozeBali Sculptures (APIO15_sculpture)C++20
100 / 100
188 ms696 KiB
/* * Author: Nonoze * Created: Sunday 14/12/2025 */ #include <bits/stdc++.h> using namespace std; #ifndef DEBUG #define dbg(...) #endif // #define cout cerr << "OUT: " #define endl '\n' #define endlfl '\n' << flush #define quit(x) return (void)(cout << x << endl) template<typename T> void read(T& x) { cin >> x; } template<typename T1, typename T2> void read(pair<T1, T2>& p) { read(p.first), read(p.second); } template<typename T> void read(vector<T>& v) { for (auto& x : v) read(x); } template<typename T1, typename T2> void read(T1& x, T2& y) { read(x), read(y); } template<typename T1, typename T2, typename T3> void read(T1& x, T2& y, T3& z) { read(x), read(y), read(z); } template<typename T1, typename T2, typename T3, typename T4> void read(T1& x, T2& y, T3& z, T4& zz) { read(x), read(y), read(z), read(zz); } template<typename T> void print(vector<T>& v) { for (auto& x : v) cout << x << ' '; cout << endl; } #define sz(x) (int)(x.size()) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() #define make_unique(v) sort(all(v)), v.erase(unique(all(v)), (v).end()) #define pb push_back #define mp(a, b) make_pair(a, b) #define fi first #define se second #define cmin(a, b) a = min(a, b) #define cmax(a, b) a = max(a, b) #define YES cout << "YES" << endl #define NO cout << "NO" << endl #define QYES quit("YES") #define QNO quit("NO") #define int long long #define double long double const int inf = numeric_limits<int>::max() / 4; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int MOD = 1e9+7, LOG=20; void solve(); signed main() { ios::sync_with_stdio(0); cin.tie(0); int tt=1; // cin >> tt; while(tt--) solve(); return 0; } int n, x, y; vector<int> a; struct calc { vector<int> memo1; vector<vector<bool>> memo2; int dp(int pos, int bit, int ans) { if (pos==n) return 0; if (memo1[pos]!=-1) return memo1[pos]; int res=inf; for (int i=pos; i<n; i++) { int sum=a[i]-(pos==0?0:a[pos-1]); if ((sum & (1LL<<bit))==0 && ((sum>>bit) | (ans>>bit))==(ans>>bit)) { cmin(res, 1+dp(i+1, bit, ans)); } } return memo1[pos]=res; } bool dp2(int pos, int used, int bit, int ans) { if (used>y) return 0; if (pos==n) return (used>=x); if (used==y) return 0; if (memo2[pos][used]) return 0; for (int i=pos; i<n; i++) { int sum=a[i]-(pos==0?0:a[pos-1]); if ((sum & (1LL<<bit))==0 && ((sum>>bit) | (ans>>bit))==(ans>>bit)) { if (dp2(i+1, used+1, bit, ans)) return 1; } } memo2[pos][used]=1; return 0; } int solve(int bit, int ans) { if (x==1) { memo1.assign(n, -1); return dp(0, bit, ans); } else { memo2.assign(n, vector<bool>(y, 0)); auto res=dp2(0, 0, bit, ans); return (res?1:inf); } } }; void solve() { read(n, x, y); a.clear(), a.resize(n); read(a); for (int i=1; i<n; i++) a[i]+=a[i-1]; int ans=0; for (int bit=42; bit>=0; bit--) { calc solver; int nb=solver.solve(bit, ans); if (nb>y) ans |= (1LL<<bit); } cout << ans << endl; }
#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...