Submission #54088

#TimeUsernameProblemLanguageResultExecution timeMemory
54088Mahmoud_AdelBali Sculptures (APIO15_sculpture)C++14
100 / 100
250 ms1252 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/detail/standard_policies.hpp> #include <ext/pb_ds/assoc_container.hpp> // Common file #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update #define f first #define s second #define pb push_back #define mp make_pair #define clr(dp,i) memset(dp,i,sizeof(dp)) #define opt ios_base::sync_with_stdio(NULL);cin.tie(NULL);cout.tie(NULL); using namespace std; using namespace __gnu_pbds; typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> oset; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int, int> pii; const long long mod = 1e9+7; const ld pi = 3.14159265358979323846264338327950288; //======================================== ll n, l, r, sum[2001], a[2001], dp[101][101], mem[2001], ans; ll h = (1LL << 60) - 1; ll inf = 1e18; bool sol(ll T) { clr(dp, 0); dp[0][0] = 1; for(int j=1; j<=r; j++) { for(int i=j; i<=n; i++) { ll tmp = 0; for(int k=0; k<i; k++) { ll enc = sum[i] - tmp; enc ^= h; //cout << sum[i] << " " << tmp << " " << b << " " << c << endl; //cout << sum << " " << tmp << endl; if(dp[k][j-1] && (enc & T) == T) dp[i][j] = 1; tmp += a[k]; } } } for(int j=l; j<=r; j++) { if(dp[n][j]) return 1; } return 0; } bool check(ll T) { for(int i=0; i<2001; i++) mem[i] = inf; mem[0] = 0; for(int i=1; i<=n; i++) { ll tmp = 0; for(int k=0; k<i; k++) { ll enc = sum[i] - tmp; enc ^= h; //cout << sum[i] << " " << tmp << " " << b << " " << c << endl; //cout << sum << " " << tmp << endl; if((T & enc) == T) mem[i] = min(mem[i], mem[k] + 1); tmp += a[k]; } } if(mem[n] <= r) return 1; return 0; } int main() { opt; cin >> n >> l >> r; for(int i=0; i<n; i++) cin >> a[i], sum[i+1] = sum[i] + a[i]; if(l != 1) { for(int i=60; i>=0; i--) { if(sol((ans | (1LL << i)))) ans |= (1LL << i); } cout << (ans^h) << endl; } else { for(int i=60; i>=0; i--) { if(check((ans | (1LL << i)))) ans |= (1LL << i); } cout << (ans^h) << 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...