제출 #554708

#제출 시각아이디문제언어결과실행 시간메모리
554708alextodoranBali Sculptures (APIO15_sculpture)C++17
100 / 100
80 ms536 KiB
/** ____ ____ ____ ____ ____ ||a |||t |||o |||d |||o || ||__|||__|||__|||__|||__|| |/__\|/__\|/__\|/__\|/__\| **/ #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N_MAX = 2000; const int BITS = 41; int N, Xmin, Xmax; int V[N_MAX + 2]; bool can[N_MAX + 2][N_MAX + 2]; bool makePrefSlow (ll pref, int suffLen) { fill(can[0] + 1, can[0] + Xmax + 1, false); can[0][0] = true; for (int i = 1; i <= N; i++) { can[i][0] = false; for (int x = 1; x <= Xmax; x++) { can[i][x] = false; ll sum = 0; for (int j = i; j >= 1; j--) { sum += V[j]; if ((sum & ~pref) >= ((ll) 1 << suffLen)) { continue; } if (can[j - 1][x - 1] == true) { can[i][x] = true; break; } } } } for (int x = Xmin; x <= Xmax; x++) { if (can[N][x] == true) { return true; } } return false; } int minX[N_MAX + 2]; bool makePrefFast (ll pref, int suffLen) { minX[0] = 0; for (int i = 1; i <= N; i++) { minX[i] = Xmax + 1; ll sum = 0; for (int j = i; j >= 1; j--) { sum += V[j]; if ((sum & ~pref) >= ((ll) 1 << suffLen)) { continue; } minX[i] = min(minX[i], minX[j - 1] + 1); } } return (minX[N] <= Xmax); } bool makePref (ll pref, int suffLen) { return (Xmin == 1 ? makePrefFast(pref, suffLen) : makePrefSlow(pref, suffLen)); } int main () { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> N >> Xmin >> Xmax; for (int i = 1; i <= N; i++) { cin >> V[i]; } ll answer = 0; for (int bit = BITS - 1; bit >= 0; bit--) { if (makePref(answer, bit) == false) { answer |= ((ll) 1 << bit); } } cout << answer << "\n"; 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...