Submission #883395

#TimeUsernameProblemLanguageResultExecution timeMemory
883395SalihSahinBali Sculptures (APIO15_sculpture)C++14
100 / 100
782 ms776 KiB
#include<bits/stdc++.h>
#define pb push_back
#define int long long
#define mp make_pair
 
using namespace std;
const int inf = 1e18;
const int mod = 1e9 + 7;
const int N = 1e5 + 5;

vector<int> f2(65);

int bf(int n, int a, int b, vector<int> &arr){
    int ans = inf;
    
    for(int j = 1; j < (1 << n); j += 2){
        int g = 0, val = 0, sum = 0;
        for(int i = 0; i < n; i++){
            if(j & (1 << i)){
                val |= sum;
                sum = 0;
                g++;
            }
            sum += arr[i];
        }
        val |= sum;
        if(g >= a && g <= b){
            if(val > ans) continue;
            ans = min(ans, val);
        }
    }

    return ans;
}

int f(int n, int a, int b, vector<int> &arr, vector<int>&pre, int alma, int preans){ // bu biti almamaya calisiyoruz invalid olan bitleri de almadan basarirsak (valid |= (1 << alma), alma--)
    vector<int> dpmn(n+1, inf);
    dpmn[0] = 0;

    for(int i = 0; i < n; i++){
            for(int k = i + 1; k <= n; k++){
                if((pre[k] - pre[i]) & f2[alma]) continue;
                if(((pre[k] - pre[i])|preans) > f2[alma] + preans) continue;
                dpmn[k] = min(dpmn[k],  dpmn[i] + 1);
            }
    }

    vector<int> dpmx(n+1, 0);
    dpmn[0] = 0;

    for(int i = 0; i < n; i++){
            for(int k = i + 1; k <= n; k++){
                if((pre[k] - pre[i]) & f2[alma]) continue;
                if(((pre[k] - pre[i])|preans) > f2[alma] + preans) continue;
                dpmx[k] = max(dpmx[k],  dpmx[i] + 1);
            }
    }

    bool ok = (dpmx[n] >= a && dpmn[n] <= b);
    return ok;
}


int32_t main(){
    ios_base::sync_with_stdio(false), cin.tie();
    f2[0] = 1;
    for(int i = 1; i <= 60; i++){
        f2[i] = f2[i-1] * 2;
    }

    int n, a, b;
    cin>>n>>a>>b;
    vector<int> arr(n), pre(n+1);
    for(int i = 0; i < n; i++){
        cin>>arr[i];
        pre[i+1] = pre[i] + arr[i];
    }
    int ans = 0;
    for(int i = 60; i >= 0; i--){
        if(!f(n, a, b, arr, pre, i, ans)){
            ans += f2[i];
        }
    }

    cout<<ans<<endl;
    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...