Submission #230479

#TimeUsernameProblemLanguageResultExecution timeMemory
230479AlexLuchianovBali Sculptures (APIO15_sculpture)C++14
100 / 100
161 ms512 KiB
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <cassert> #include <bitset> using namespace std; using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int const nmax = 2000; ll v[1 + nmax], sum[1 + nmax]; int dp[1 + nmax]; bool valid(int x, int y, ll lim){ return ((lim | (sum[y] - sum[x - 1])) == lim); } bitset<1 + nmax> dp2[5 + nmax / 20]; /* 6 1 3 8 1 2 1 5 4 */ bool check(int n, int a, int b, ll lim){ if(a == 1){ dp[0] = 0; for(int i = 1;i <= n; i++) { dp[i] = n + 1; for(int j = i; 1 <= j; j--) if(valid(j, i, lim) == 1) dp[i] = min(dp[i], dp[j - 1] + 1); } return (dp[n] <= b); } else { for(int i = 0;i <= n; i++) dp2[i] = dp2[n + 1]; dp2[0][0] = 1; for(int i = 1; i <= n; i++) for(int j = i; 1 <= j; j--) if(valid(j, i, lim) == 1) dp2[i] |= (dp2[j - 1]<<1); for(int i = a; i <= b; i++) if(dp2[n][i] == 1) return 1; return 0; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, a, b; cin >> n >> a >> b; for(int i = 1;i <= n; i++) { cin >> v[i]; sum[i] = sum[i - 1] + v[i]; } ll sol = (1LL << 50) - 1; for(int i = 49; 0 <= i; i--) if(check(n, a, b, sol ^ (1LL << i)) == 1) sol ^= (1LL << i); cout << sol; return 0; }
#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...