Submission #389560


Source Code Expand

#include <cstdio>
#include <bitset>
#include <algorithm>
#include <vector>
#include <cassert>
using namespace std;

int N, K, A, B;
int Xi[606];
bitset<180001> bs[606];
int d1[180001], d2[180001];

bitset<180001> memo[31][301];
const int W = 20;

vector<int> restore(int sum)
{
	vector<int> ret;
	int loc = N, rem = K;
	while (loc) {
		int step = loc % W;
		if (step == 0) step = W;
		int rt = loc - step;
		for (int i = 0; i < (1 << step); ++i) {
			int tot = 0, cnt = __builtin_popcount(i);
			for (int j = 0; j < step; ++j) if (i & (1 << j)) tot += Xi[rt + j];
			if (rem >= cnt && sum >= tot && rem - cnt <= rt && memo[rt / W][rem - cnt][sum - tot]) {
				rem -= cnt;
				sum -= tot;
				for (int j = 0; j < step; ++j) if (i & (1 << j)) {
					ret.push_back(rt + j);
				}

				goto nex;
			}
		}
		fprintf(stderr, "><");
		break;
	nex:
		loc -= step;
	}
	sort(ret.begin(), ret.end());
	return ret;
}

int main()
{
	scanf("%d%d%d%d", &N, &K, &A, &B);
	for (int i = 0; i < N; ++i) scanf("%d", Xi + i);
	bs[0].set(0);

	if (K <= N / 2) {
		for (int i = 0; i <= N; ++i) {
			if (i % W == 0) {
				for (int j = 0; j <= K; ++j) memo[i / W][j] = bs[j];
			}
			if (i == N) break;
			for (int j = K; j >= 1; --j) bs[j] |= bs[j - 1] << Xi[i];
		}

		for (int i = 0; i <= 180000; ++i) d1[i] = d2[i] = 10000000;
		for (int i = 0; i <= 180000; ++i) if ((int)bs[K][i]) d1[i] = d2[i] = 0;

		for (int i = 1; i <= 180000; ++i) d1[i] = min(d1[i], d1[i - 1] + 1);
		for (int i = 179999; i >= 0; --i) d2[i] = min(d2[i], d2[i + 1] + 1);

		pair<int, int> ret = make_pair(-114514, 0);
		for (int i = A; i <= B; ++i) ret = max(ret, make_pair(min(d1[i], d2[i]), -i));
		printf("%d\n", -ret.second);

		int finder;
		int s = ret.second * -1;
		if (d1[s] > d2[s]) finder = s + d2[s];
		else finder = s - d1[s];
		vector<int> res = restore(finder);
		for (int i = 0; i < res.size(); ++i) {
			if (i > 0) printf(" ");
			printf("%d", res[i] + 1);
		}
		puts("");
	} else {
		K = N - K;
		int total = 0;
		for (int i = 0; i < N; ++i) total += Xi[i];

		for (int i = 0; i <= N; ++i) {
			if (i % W == 0) {
				for (int j = 0; j <= K; ++j) memo[i / W][j] = bs[j];
			}
			if (i == N) break;
			for (int j = K; j >= 1; --j) bs[j] |= bs[j - 1] << Xi[i];
		}

		for (int i = 0; i <= 180000; ++i) d1[i] = d2[i] = 10000000;
		for (int i = 0; i <= 180000; ++i) if ((int)bs[K][i] && 0 <= total - i && total - i <= 180000) d1[total - i] = d2[total - i] = 0;

		for (int i = 1; i <= 180000; ++i) d1[i] = min(d1[i], d1[i - 1] + 1);
		for (int i = 179999; i >= 0; --i) d2[i] = min(d2[i], d2[i + 1] + 1);

		pair<int, int> ret = make_pair(-114514, 0);
		for (int i = A; i <= B; ++i) ret = max(ret, make_pair(min(d1[i], d2[i]), -i));
		printf("%d\n", -ret.second);

		int finder;
		int s = ret.second * -1;
		if (d1[s] > d2[s]) finder = s + d2[s];
		else finder = s - d1[s];
		finder = total - finder;
		vector<int> res = restore(finder);

		bool a[6000];
		for (int i = 0; i < N; ++i) a[i] = false;
		for (int i = 0; i < res.size(); ++i) a[res[i]] = true;

		bool u = false;
		for (int i = 0; i < N; ++i) if (!a[i]) {
			if (u) printf(" ");
			u = true;
			printf("%d", i + 1);
		}
		puts("");
	}
	return 0;
}

Submission Info

Submission Time
Task B - Card Game Strategy
User Operasan
Language C++11 (GCC 4.9.2)
Score 100
Code Size 3298 Byte
Status AC
Exec Time 4691 ms
Memory 220796 KiB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:48:35: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d", &N, &K, &A, &B);
                                   ^
./Main.cpp:49:49: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  for (int i = 0; i < N; ++i) scanf("%d", Xi + i);
                                                 ^

Judge Result

Set Name All
Score / Max Score 100 / 100
Status
AC × 56
Set Name Test Cases
All 00_sample_00, 00_sample_01, 10_minirandom_00, 10_minirandom_01, 10_minirandom_02, 10_minirandom_03, 10_minirandom_04, 10_minirandom_05, 10_minirandom_06, 10_minirandom_07, 10_minirandom_08, 10_minirandom_09, 30_barabara_00, 30_barabara_01, 30_barabara_02, 30_barabara_03, 30_barabara_04, 30_barabara_05, 30_barabara_06, 30_barabara_07, 30_barabara_08, 30_barabara_09, 40_maxrandom_00, 40_maxrandom_01, 40_maxrandom_02, 40_maxrandom_03, 40_maxrandom_04, 40_maxrandom_05, 40_maxrandom_06, 40_maxrandom_07, 40_maxrandom_08, 40_maxrandom_09, 40_maxrandom_10, 40_maxrandom_11, 40_maxrandom_12, 40_maxrandom_13, 40_maxrandom_14, 40_maxrandom_15, 40_maxrandom_16, 40_maxrandom_17, 40_maxrandom_18, 40_maxrandom_19, 70_sparse_00, 70_sparse_01, 70_sparse_02, 70_sparse_03, 80_max_00, 80_max_01, 85_large_00, 85_large_01, 85_large_02, 85_large_03, 85_large_04, 85_large_05, 85_large_06, 85_large_07
Case Name Status Exec Time Memory
00_sample_00 AC 384 ms 220768 KiB
00_sample_01 AC 388 ms 220764 KiB
10_minirandom_00 AC 388 ms 220724 KiB
10_minirandom_01 AC 386 ms 220720 KiB
10_minirandom_02 AC 386 ms 220728 KiB
10_minirandom_03 AC 387 ms 220724 KiB
10_minirandom_04 AC 384 ms 220764 KiB
10_minirandom_05 AC 388 ms 220768 KiB
10_minirandom_06 AC 387 ms 220724 KiB
10_minirandom_07 AC 390 ms 220772 KiB
10_minirandom_08 AC 398 ms 220772 KiB
10_minirandom_09 AC 387 ms 220764 KiB
30_barabara_00 AC 1380 ms 220728 KiB
30_barabara_01 AC 585 ms 220720 KiB
30_barabara_02 AC 580 ms 220724 KiB
30_barabara_03 AC 1263 ms 220724 KiB
30_barabara_04 AC 524 ms 220720 KiB
30_barabara_05 AC 957 ms 220724 KiB
30_barabara_06 AC 636 ms 220728 KiB
30_barabara_07 AC 516 ms 220728 KiB
30_barabara_08 AC 1613 ms 220768 KiB
30_barabara_09 AC 1418 ms 220728 KiB
40_maxrandom_00 AC 3606 ms 220728 KiB
40_maxrandom_01 AC 3089 ms 220728 KiB
40_maxrandom_02 AC 768 ms 220712 KiB
40_maxrandom_03 AC 1139 ms 220724 KiB
40_maxrandom_04 AC 1584 ms 220728 KiB
40_maxrandom_05 AC 2823 ms 220768 KiB
40_maxrandom_06 AC 3080 ms 220724 KiB
40_maxrandom_07 AC 3329 ms 220796 KiB
40_maxrandom_08 AC 4352 ms 220728 KiB
40_maxrandom_09 AC 2282 ms 220772 KiB
40_maxrandom_10 AC 1952 ms 220728 KiB
40_maxrandom_11 AC 3634 ms 220724 KiB
40_maxrandom_12 AC 3390 ms 220744 KiB
40_maxrandom_13 AC 3527 ms 220784 KiB
40_maxrandom_14 AC 1944 ms 220724 KiB
40_maxrandom_15 AC 1211 ms 220720 KiB
40_maxrandom_16 AC 679 ms 220724 KiB
40_maxrandom_17 AC 1212 ms 220756 KiB
40_maxrandom_18 AC 621 ms 220760 KiB
40_maxrandom_19 AC 3063 ms 220736 KiB
70_sparse_00 AC 390 ms 220728 KiB
70_sparse_01 AC 391 ms 220776 KiB
70_sparse_02 AC 452 ms 220728 KiB
70_sparse_03 AC 479 ms 220728 KiB
80_max_00 AC 387 ms 220728 KiB
80_max_01 AC 491 ms 220724 KiB
85_large_00 AC 2254 ms 220728 KiB
85_large_01 AC 1149 ms 220728 KiB
85_large_02 AC 2701 ms 220728 KiB
85_large_03 AC 1194 ms 220756 KiB
85_large_04 AC 3573 ms 220728 KiB
85_large_05 AC 1475 ms 220728 KiB
85_large_06 AC 4691 ms 220760 KiB
85_large_07 AC 1680 ms 220720 KiB