Submission #47000

#TimeUsernameProblemLanguageResultExecution timeMemory
47000rsalescBrunhilda’s Birthday (BOI13_brunhilda)C++14
100 / 100
530 ms211176 KiB
#include <bits/stdc++.h>
using namespace std;

const int P = 1e7+10;
const int M = 1e5+10;

struct Node {
	int v;
	Node * nxt;
};

int mx;
Node * q[P];
int dp[P];

Node* add(Node * no, int x) {
	return new Node({x, no});
}

void clear(Node * no) {
	if(no == 0) return;
	clear(no->nxt);
	delete no;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int m, Q;
	cin >> m >> Q;

	for(int i = 0; i < m; i++) {
		int x;
		cin >> x;
		q[0] = add(q[0], x);
	}

	for(int i = 1; i < P; i++) dp[i] = 1e9+10;

	for(int i = 0; i < P; i++) {
		Node* cur = q[i];
		while(cur) {
			int p = cur->v;
			int nxt = i+p;
			int til = min(nxt, P);

			for(int j = max(mx, i+1); j < til; j++) {
				dp[j] = dp[i]+1;
			}

			mx = max(mx, nxt);

			// fast jump
			nxt = mx / p * p;
			if(nxt < P) q[nxt] = add(q[nxt], p);
			cur = cur->nxt;
		}
	}

	for(int i = 0; i < Q; i++) {
		int x;
		cin >> x;
		if(dp[x] > 1e9) cout << "oo" << endl;
		else cout << dp[x] << endl;
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...