Submission #56586

# Submission time Handle Problem Language Result Execution time Memory
56586 2018-07-11T21:31:27 Z Xellos Snake Escaping (JOI18_snake_escaping) C++14
65 / 100
2000 ms 17512 KB
#include <bits/stdc++.h>
// iostream is too mainstream
#include <cstdio>
// bitch please
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <cmath>
#include <iomanip>
#include <time.h>
#define dibs reserve
#define OVER9000 1234567890123456789LL
#define ALL_THE(CAKE,LIE) for(auto LIE =CAKE.begin(); LIE != CAKE.end(); LIE++)
#define tisic 47
#define soclose 1e-8
#define chocolate win
// so much chocolate
#define patkan 9
#define ff first
#define ss second
#define abs(x) ((x < 0)?-(x):x)
#define uint unsigned int
#define dbl long double
#define pi 3.14159265358979323846
using namespace std;
// mylittledoge

typedef long long cat;

#ifdef DONLINE_JUDGE
	// palindromic tree is better than splay tree!
	#define lld I64d
#endif

int cost_arr[2][1<<19];
int cost[1<<20];
int ans[1000000];
cat query[1000000];

void solve(int d, int B, int cl, int cr, int ql, int qr) {
	if(ql == qr) return;
	if(d == B) {
		for(int i = ql; i < qr; i++)
			ans[query[i]&((1LL<<20)-1)] += ((query[i]>>60) ? -cost[cl] : cost[cl]);
		return;
	}
	int cnt[3] = {};
	for(int i = ql; i < qr; i++) {
		if((query[i]>>(40+d))&1) cnt[(query[i]>>(20+d))&1]++;
		else cnt[2]++;
	}
	if(cnt[2] <= cnt[0] && cnt[2] <= cnt[1]) {
		for(int i = 0; i < (1<<(B-1-d)); i++) {
			cost_arr[0][i] = cost[cl+2*i];
			cost_arr[1][i] = cost[cl+2*i+1];
		}
		for(int i = 0; i < (1<<(B-1-d)); i++) cost[cl+i] = cost_arr[0][i];
		for(int i = 0; i < (1<<(B-1-d)); i++) cost[cl+(1<<(B-1-d))+i] = cost_arr[1][i];
		int a = ql, b = qr;
		for(int i = ql; i < b; i++) {
			if((query[i]>>(40+d))&1) {
				if((query[i]>>(20+d))&1) {
					while(b > i+1 && ((query[b-1]>>(40+d))&1) == 1 && ((query[b-1]>>(20+d))&1) == 1) b--;
					if(i+1 == b) break;
					swap(query[i], query[b-1]);
					b--;
				}
				else {
					while(a < i && ((query[a]>>(40+d))&1) == 1 && ((query[a]>>(20+d))&1) == 0) a++;
					if(a == i) continue;
					swap(query[i], query[a]);
					a++;
				}
			}
		}
		solve(d+1, B, cl, cl+(1<<(B-1-d)), ql, ql+cnt[0]+cnt[2]);
		a = qr-cnt[1];
		for(int i = ql; i < a; i++) if(((query[i]>>(40+d))&1) == 0) {
			while(a > i+1 && ((query[a-1]>>(40+d))&1) == 0) a--;
			if(i+1 == a || a == ql+cnt[0]) break;
			swap(query[i], query[a-1]);
			a--;
		}
		solve(d+1, B, cl+(1<<(B-1-d)), cr, qr-cnt[2]-cnt[1], qr);
		return;
	}
	int x = (int) (cnt[1] < cnt[0]);
	for(int i = 0; i < (1<<(B-1-d)); i++) {
		cost_arr[0][i] = cost[cl+2*i+1-x];
		cost_arr[1][i] = cost[cl+2*i] + cost[cl+2*i+1];
	}
	for(int i = 0; i < (1<<(B-1-d)); i++) cost[cl+i] = cost_arr[0][i];
	for(int i = 0; i < (1<<(B-1-d)); i++) cost[cl+(1<<(B-1-d))+i] = cost_arr[1][i];
	int a = ql, b = qr;
	for(int i = ql; i < b; i++) {
		if((query[i]>>(40+d))&1) {
			if(((query[i]>>(20+d))&1) != x) {
				while(a < i && ((query[a]>>(40+d))&1) == 1 && ((query[a]>>(20+d))&1) != x) a++;
				if(a == i) continue;
				swap(query[i], query[a]);
				a++;
				i--;
			}
		}
		else {
			while(b > i+1 && ((query[b-1]>>(40+d))&1) == 0) b--;
			if(i+1 == b) break;
			swap(query[i], query[b-1]);
			b--;
			i--;
		}
	}
	for(int i = ql+cnt[1-x]; i < ql+cnt[1-x]+cnt[x]; i++) query[i] ^= 1LL<<60;
	solve(d+1, B, cl, cl+(1<<(B-1-d)), ql, ql+cnt[1-x]+cnt[x]);
	a = qr-cnt[2];
	for(int i = ql; i < a; i++) if(((query[i]>>(40+d))&1) == 1 && ((query[i]>>(20+d))&1) == x) {
		while(a > i+1 && ((query[a-1]>>(40+d))&1) == 1 && ((query[a-1]>>(20+d))&1) == x) a--;
		if(i+1 == a || a == ql+cnt[1-x]) break;
		swap(query[i], query[a-1]);
		a--;
	}
	for(int i = ql+cnt[1-x]; i < ql+cnt[1-x]+cnt[x]; i++) query[i] ^= 1LL<<60;
	solve(d+1, B, cl+(1<<(B-1-d)), cr, qr-cnt[2]-cnt[x], qr);
}

int main() {
	cin.sync_with_stdio(0);
	cin.tie(0);
	cout << fixed << setprecision(10);
	int B, Q;
	char buf[(1<<20) + 10];
	scanf("%d %d %s", &B, &Q, buf);
	for(int i = 0; i < (1<<B); i++) {
		int b = 0;
		for(int j = 0; j < B; j++) b = 2*b + ((i>>j)&1);
		cost[b] = buf[i]-'0';
	}
	// query: mask, bits, id
	char buf_small[30];
	for(int i = 0; i < Q; i++) {
		scanf("%s", buf_small);
		query[i] = i;
		for(int j = 0; j < B; j++) {
			if(buf_small[j] == '?') continue;
			query[i] += 1LL<<(j+40);
			if(buf_small[j] == '1') query[i] += 1LL<<(j+20);
		}
	}
	memset(ans, 0, sizeof(ans));
	solve(0, B, 0, 1<<B, 0, Q);
	for(int i = 0; i < Q; i++) cout << ans[i] << "\n";
	return 0;}

// look at my code
// my code is amazing

Compilation message

snake_escaping.cpp: In function 'int main()':
snake_escaping.cpp:138:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %s", &B, &Q, buf);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
snake_escaping.cpp:147:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s", buf_small);
   ~~~~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 6 ms 4344 KB Output is correct
3 Correct 7 ms 4376 KB Output is correct
4 Correct 6 ms 4480 KB Output is correct
5 Correct 8 ms 4480 KB Output is correct
6 Correct 7 ms 4508 KB Output is correct
7 Correct 44 ms 4528 KB Output is correct
8 Correct 5 ms 4528 KB Output is correct
9 Correct 7 ms 4528 KB Output is correct
10 Correct 6 ms 4528 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 6 ms 4344 KB Output is correct
3 Correct 7 ms 4376 KB Output is correct
4 Correct 6 ms 4480 KB Output is correct
5 Correct 8 ms 4480 KB Output is correct
6 Correct 7 ms 4508 KB Output is correct
7 Correct 44 ms 4528 KB Output is correct
8 Correct 5 ms 4528 KB Output is correct
9 Correct 7 ms 4528 KB Output is correct
10 Correct 6 ms 4528 KB Output is correct
11 Correct 432 ms 16288 KB Output is correct
12 Correct 536 ms 16288 KB Output is correct
13 Correct 918 ms 16288 KB Output is correct
14 Correct 903 ms 16288 KB Output is correct
15 Correct 760 ms 16360 KB Output is correct
16 Correct 972 ms 16360 KB Output is correct
17 Correct 1446 ms 16360 KB Output is correct
18 Correct 284 ms 17404 KB Output is correct
19 Correct 350 ms 17404 KB Output is correct
20 Correct 448 ms 17404 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 6 ms 4344 KB Output is correct
3 Correct 7 ms 4376 KB Output is correct
4 Correct 6 ms 4480 KB Output is correct
5 Correct 8 ms 4480 KB Output is correct
6 Correct 7 ms 4508 KB Output is correct
7 Correct 44 ms 4528 KB Output is correct
8 Correct 5 ms 4528 KB Output is correct
9 Correct 7 ms 4528 KB Output is correct
10 Correct 6 ms 4528 KB Output is correct
11 Correct 432 ms 16288 KB Output is correct
12 Correct 536 ms 16288 KB Output is correct
13 Correct 918 ms 16288 KB Output is correct
14 Correct 903 ms 16288 KB Output is correct
15 Correct 760 ms 16360 KB Output is correct
16 Correct 972 ms 16360 KB Output is correct
17 Correct 1446 ms 16360 KB Output is correct
18 Correct 284 ms 17404 KB Output is correct
19 Correct 350 ms 17404 KB Output is correct
20 Correct 448 ms 17404 KB Output is correct
21 Correct 458 ms 17404 KB Output is correct
22 Correct 555 ms 17404 KB Output is correct
23 Correct 1710 ms 17404 KB Output is correct
24 Correct 1682 ms 17404 KB Output is correct
25 Correct 1097 ms 17512 KB Output is correct
26 Correct 1780 ms 17512 KB Output is correct
27 Execution timed out 2054 ms 17512 KB Time limit exceeded
28 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 6 ms 4344 KB Output is correct
3 Correct 7 ms 4376 KB Output is correct
4 Correct 6 ms 4480 KB Output is correct
5 Correct 8 ms 4480 KB Output is correct
6 Correct 7 ms 4508 KB Output is correct
7 Correct 44 ms 4528 KB Output is correct
8 Correct 5 ms 4528 KB Output is correct
9 Correct 7 ms 4528 KB Output is correct
10 Correct 6 ms 4528 KB Output is correct
11 Correct 115 ms 17512 KB Output is correct
12 Correct 123 ms 17512 KB Output is correct
13 Correct 336 ms 17512 KB Output is correct
14 Correct 513 ms 17512 KB Output is correct
15 Correct 165 ms 17512 KB Output is correct
16 Correct 450 ms 17512 KB Output is correct
17 Correct 988 ms 17512 KB Output is correct
18 Correct 55 ms 17512 KB Output is correct
19 Correct 94 ms 17512 KB Output is correct
20 Correct 107 ms 17512 KB Output is correct
21 Correct 336 ms 17512 KB Output is correct
22 Correct 426 ms 17512 KB Output is correct
23 Correct 191 ms 17512 KB Output is correct
24 Correct 449 ms 17512 KB Output is correct
25 Correct 1086 ms 17512 KB Output is correct
26 Correct 77 ms 17512 KB Output is correct
27 Correct 95 ms 17512 KB Output is correct
28 Correct 110 ms 17512 KB Output is correct
29 Correct 314 ms 17512 KB Output is correct
30 Correct 407 ms 17512 KB Output is correct
31 Correct 156 ms 17512 KB Output is correct
32 Correct 554 ms 17512 KB Output is correct
33 Correct 1031 ms 17512 KB Output is correct
34 Correct 83 ms 17512 KB Output is correct
35 Correct 839 ms 17512 KB Output is correct
36 Correct 791 ms 17512 KB Output is correct
37 Correct 766 ms 17512 KB Output is correct
38 Correct 801 ms 17512 KB Output is correct
39 Correct 755 ms 17512 KB Output is correct
40 Correct 780 ms 17512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 6 ms 4344 KB Output is correct
3 Correct 7 ms 4376 KB Output is correct
4 Correct 6 ms 4480 KB Output is correct
5 Correct 8 ms 4480 KB Output is correct
6 Correct 7 ms 4508 KB Output is correct
7 Correct 44 ms 4528 KB Output is correct
8 Correct 5 ms 4528 KB Output is correct
9 Correct 7 ms 4528 KB Output is correct
10 Correct 6 ms 4528 KB Output is correct
11 Correct 432 ms 16288 KB Output is correct
12 Correct 536 ms 16288 KB Output is correct
13 Correct 918 ms 16288 KB Output is correct
14 Correct 903 ms 16288 KB Output is correct
15 Correct 760 ms 16360 KB Output is correct
16 Correct 972 ms 16360 KB Output is correct
17 Correct 1446 ms 16360 KB Output is correct
18 Correct 284 ms 17404 KB Output is correct
19 Correct 350 ms 17404 KB Output is correct
20 Correct 448 ms 17404 KB Output is correct
21 Correct 458 ms 17404 KB Output is correct
22 Correct 555 ms 17404 KB Output is correct
23 Correct 1710 ms 17404 KB Output is correct
24 Correct 1682 ms 17404 KB Output is correct
25 Correct 1097 ms 17512 KB Output is correct
26 Correct 1780 ms 17512 KB Output is correct
27 Execution timed out 2054 ms 17512 KB Time limit exceeded
28 Halted 0 ms 0 KB -