Submission #1000076

#TimeUsernameProblemLanguageResultExecution timeMemory
1000076vjudge3은행 (IZhO14_bank)C++17
100 / 100
547 ms1680 KiB
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> b;
bitset<1<<20> vis[21];
vector<vector<int>> need[21]; 
int n, m;

int conv (vector<int>& vec) {
	int base = 1, res = 0;
	for (int i = 0; i < m; i++) {
		res += base * vec[i];
		base *= b[i].second+1;
	}
	return res;
}

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	vector<int> a (n+1);
	vector<int> cnt (1001);
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 0; i < m; i++) {
		int x;
		cin >> x;
		cnt[x]++;
	}
	for (int i = 1; i <= 1000; i++) if (cnt[i]) b.push_back({i, cnt[i]});
	m = b.size();
	for (int i = 1; i <= n; i++) {
		vector<int> cur (m);
		while (true) {
			cur[0]++;
			for (int j = 0; j < m; j++) if (cur[j] > b[j].second) {
				if (j == m-1) goto nxt;
				cur[j] = 0;
				cur[j+1]++;
			}
			int sum = 0;
			for (int j = 0; j < m; j++) sum += cur[j] * b[j].first;
			if (sum == a[i]) need[i].push_back(cur);
		}
		nxt: {}
	}
	queue<pair<int, vector<int>>> bfs;
	vector<int> init (m);
	bfs.push({0, init});
	while (!bfs.empty()) {
		auto [i, used] = bfs.front();
		if (i == n) {
			cout << "YES\n";
			exit(0);
		}
		bfs.pop();
		i++;
		for (auto& v : need[i]) {
			bool ok = true;
			for (int k = 0; k < m; k++) if (used[k] + v[k] > b[k].second) {
				ok = false;
				break;
			}
			if (ok) {
				for (int k = 0; k < m; k++) used[k] += v[k];
				int h = conv(used);
				if (!vis[i][h]) {
					vis[i][h] = true;
					bfs.push({i, used});
				}
				for (int k = 0; k < m; k++) used[k] -= v[k];
			}
		}
	}
	cout << "NO\n";
	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...