Submission #45000

#TimeUsernameProblemLanguageResultExecution timeMemory
45000Mamnoon_SiamBali Sculptures (APIO15_sculpture)C++17
100 / 100
123 ms4648 KiB
#pragma GCC optimize("Ofast,no-stack-protector")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>
using namespace std;

#define debug(s) cout<< #s <<" = "<< s <<endl
#define all(v) (v).begin(), (v).end()
#define KeepUnique(v) (v).erase( unique(all(v)), v.end() )
#define MEMSET(a,val) memset(a, val, sizeof a)
#define PB push_back
#define endl '\n'
#define int long long

inline int myrand(int l, int r) {
	int ret = rand(); ret <<= 15; ret ^= rand();
	if(ret < 0) ret = -ret; ret %= (r-l+1); ret += l;
	return ret;
}
template <typename F, typename S>
ostream& operator << (ostream& os, const pair< F, S>& p) {
    return os<<"(" <<p.first<<", "<<p.second<<")"; }

typedef pair<int, int> ii;
template<typename T> using min_pq =
	priority_queue<T, vector<T>, greater<T> >;

//int dx[] = {-1, +0, +1, +0};
//int dy[] = {+0, +1, +0, -1};

const int maxn = 2002;

int n, A, B;
int a[maxn];
bool dp[maxn][maxn];

int mask = (1LL << 45) - 1;

bool fek() {
	int temp[maxn];
	temp[0] = 0;
	for(int i=1; i<=n; i++) {
		temp[i] = 987654321;
		int s = 0;
		for(int j=i; j>=1; j--) {
			s += a[j];
			if((s & mask) == s) {
				temp[i] = min(temp[i], temp[j-1] + 1);
			}
		}
	} return temp[n] <= B;
}

bool can() {
	if(A == 1) return fek();
	MEMSET(dp, 0);
	dp[0][0] = 1;
	for(int k=1; k<=n; k++) {
		for(int i=1; i<=n; i++) {
			int s = 0;
			for(int j=i-1; j>=0; j--) {
				s += a[j+1];
				dp[k][i] |= ((s & mask) == s and dp[k-1][j]);
			}
		}
	}
	bool ret = false;
	for(int i=A; i<=B; i++) {
		ret |= dp[i][n];
	} return ret;
}

int32_t main () {
	//freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
	cin>>n>>A>>B;
	for(int i=1; i<=n; i++) {
		cin>>a[i];
	}
	for(int i=44; i>=0; i--) {
		mask ^= (1LL << i);
		if(!can()) mask ^= (1LL << i);
	}
	cout << mask << endl;
	return 0;
}

Compilation message (stderr)

sculpture.cpp: In function 'long long int myrand(long long int, long long int)':
sculpture.cpp:17:2: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
  if(ret < 0) ret = -ret; ret %= (r-l+1); ret += l;
  ^~
sculpture.cpp:17:26: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
  if(ret < 0) ret = -ret; ret %= (r-l+1); ret += l;
                          ^~~
#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...