Submission #164747

#TimeUsernameProblemLanguageResultExecution timeMemory
164747quocnguyen1012Bali Sculptures (APIO15_sculpture)C++14
50 / 100
297 ms4732 KiB
#include <bits/stdc++.h> #define Task "A" #define pb push_back #define int long long using namespace std; typedef long long ll; mt19937 rng (chrono::steady_clock::now().time_since_epoch().count()); const int maxn = 2005; int testbit (ll x, int n){ return x >> n & 1; } int N; int a[maxn]; ll sum[maxn]; ll dp[maxn]; int P, Q; bool submask (ll mask1, ll mask2){ return (mask1 & mask2) == mask1; } bool check (ll mask){ for (int i=1; i<=N; ++i) dp[i] = 1e9; for (int i=1; i<=N; ++i){ for (int j=i-1; j>=0; --j){ if (dp[j] < 1e9 && submask (sum[i] - sum[j], mask)){ dp[i] = min(dp[i], dp[j] + 1); } } } //cerr << f[N]; return dp[N] <= Q; } int f[105][105][50]; ll solve (int l, int K){ memset(f, -1, sizeof f); for (int i=1; i<=N; ++i){ sum[i] = sum[i-1] + a[i]; for (int j=0; j<=50; ++j){ if (testbit (sum[i], j)) f[i][1][j] = sum[i]; } } for (int i=2; i<=N; ++i){ for (int j=2; j<=min(i, K); ++j){ for (int z=0; z<=50; ++z){ f[i][j][z] = 1e17; for (int t=i-1; t>=0; --t){ if (f[t][j-1][z] == -1) continue; if (f[i][j][z] == -1) f[i][j][z] = f[t][j-1][z] | (sum[i] - sum[t]); else f[i][j][z] = min (f[i][j][z], f[t][j-1][z] | (sum[i] - sum[t])); } } } } ll ans = 1e15; for (int j=l; j<=K; ++j) for (int i=0; i<=35; ++i) if (f[N][j][i] != -1) ans = min (ans, f[N][j][i]); return ans; } signed main (void){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen (Task".inp", "r")){ freopen (Task".inp", "r", stdin); freopen (Task".out", "w", stdout); } cin >> N >> P >> Q; for (int i=1; i<=N; ++i){ cin >> a[i]; sum[i] = sum[i-1] + a[i]; } if (P == 1){ ll ans = (1ll << 62) - 1; for (int i=61; i>=0; --i){ if (check (ans -(1ll << i))) ans -= (1ll << i); ///cerr << ans << '\n'; } cout << ans; } else{ cout << solve(P, Q); } }

Compilation message (stderr)

sculpture.cpp: In function 'int main()':
sculpture.cpp:74:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen (Task".inp", "r", stdin);
         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
sculpture.cpp:75:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen (Task".out", "w", stdout);
         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
sculpture.cpp: In function 'll solve(long long int, long long int)':
sculpture.cpp:54:28: warning: iteration 50 invokes undefined behavior [-Waggressive-loop-optimizations]
                 f[i][j][z] = 1e17;
                 ~~~~~~~~~~~^~~~~~
sculpture.cpp:53:28: note: within this loop
             for (int z=0; z<=50; ++z){
                           ~^~~~
#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...