Submission #1129702

#TimeUsernameProblemLanguageResultExecution timeMemory
1129702am_aadvikSnake Escaping (JOI18_snake_escaping)C++17
22 / 100
1373 ms31840 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>
#include <algorithm>
#include <map>
#include <set>
#include <cstring>
#include <string>
#define int long long
const int inf = 1e17;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 5;
const int maxn2 = 1e5 + 5;
const int maxs = 1e3 + 5;
const int maxl = 2e3 + 5;
const int sz = 1594324;
using namespace std;

int dp[sz], log3[sz], a[sz];
int sol(int val) {
	if (dp[val]) return dp[val];

	int pos = 0, n = val, b = 0;
	while (n) {
		if ((n % 3) == 2) break;
		b += (pow(2, pos) * (n % 3));
		pos++, n /= 3;
	}

	if (n == 0) return a[b];

	int sub = pow(3, pos);
	return dp[val] = sol(val - sub) + sol(val - (2 * sub));
}

void problemA() {
	for (int i = 1; i < sz; ++i) log3[i] = log3[i / 3] + 1;

	int n, q; string s;
	cin >> n >> q >> s;
	for (int i = 0; i < (1 << n); ++i)
		a[i] = (s[i] - '0');

	while (q--) {
		cin >> s;
		int val = 0, p = 1;
		for (int i = n - 1; i >= 0; --i) {
			if (s[i] == '?') val += (p * 2);
			else val += ((s[i] - '0') * p);
			p *= 3;
		}
		cout << sol(val) << endl;
	}
}

void problemB() {
	int n, mx = 0;
	cin >> n;
	vector<int> a(n);
	for (int i = 0; i < n; mx = max(a[i], mx), ++i)
		cin >> a[i];
	if (n == 1) cout << a[0];
	else if (n == 2) cout << a[0] + a[1];
	else if (n == 3) {
		int c1 = (mx * 3ll);
		int f1 = a[0] * 3ll;
		int f2 = (a[1] * 2ll);
		int c2 = f1 + f2 + a[2];
		f1 = max(a[1], a[2]);
		f1 += a[0];
		f1 *= 2ll;
		int c3 = a[0] + f1;
		f1 = max(a[0], a[1]);
		f1 *= 3ll;
		int c4 = f1 + a[2];
		cout << min({ c1, c2, c3, c4 });
	}
	else
		cout << mx * n;
}

bool isin(int l, int r, int i) { return ((l <= i) && (i <= r)); }
vector<vector<int>> g[maxn2];
bool vis[maxn2];

bool dfs(int node, int sink, int e) {
	if (node == sink) return 1;
	vis[node] = 1;
	for (auto x : g[node])
		if (!vis[x[0]] && (isin(x[1], x[2], e)))
			if (dfs(x[0], sink, e))
				return 1;
	return 0;
}

void problemC() {
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; ++i) {
		int u, v, o, c;
		cin >> u >> v >> o >> c;
		g[u].push_back({ v, o, c });
		g[v].push_back({ u, o, c });
	}

	int q;
	cin >> q;
	while (q--) {
		int u, v, t;
		cin >> u >> v >> t;
		cout << (dfs(u, v, t) ? "YES" : "NO") << endl;
		for (int i = 0; i < n; ++i) vis[i] = 0;
	}
}

int32_t main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int t = 1;
	while (t--) {
		problemA();
	}
}
#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...