Submission #56585

# Submission time Handle Problem Language Result Execution time Memory
56585 2018-07-11T21:29:00 Z Xellos Snake Escaping (JOI18_snake_escaping) C++14
65 / 100
2000 ms 20284 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) 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) 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 7 ms 4460 KB Output is correct
3 Correct 7 ms 4540 KB Output is correct
4 Correct 8 ms 4540 KB Output is correct
5 Correct 8 ms 4540 KB Output is correct
6 Correct 8 ms 4540 KB Output is correct
7 Correct 6 ms 4540 KB Output is correct
8 Correct 6 ms 4560 KB Output is correct
9 Correct 6 ms 4560 KB Output is correct
10 Correct 5 ms 4564 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 7 ms 4460 KB Output is correct
3 Correct 7 ms 4540 KB Output is correct
4 Correct 8 ms 4540 KB Output is correct
5 Correct 8 ms 4540 KB Output is correct
6 Correct 8 ms 4540 KB Output is correct
7 Correct 6 ms 4540 KB Output is correct
8 Correct 6 ms 4560 KB Output is correct
9 Correct 6 ms 4560 KB Output is correct
10 Correct 5 ms 4564 KB Output is correct
11 Correct 379 ms 16392 KB Output is correct
12 Correct 478 ms 16392 KB Output is correct
13 Correct 823 ms 16392 KB Output is correct
14 Correct 946 ms 16392 KB Output is correct
15 Correct 713 ms 16556 KB Output is correct
16 Correct 1020 ms 16556 KB Output is correct
17 Correct 1374 ms 16556 KB Output is correct
18 Correct 246 ms 17300 KB Output is correct
19 Correct 342 ms 17300 KB Output is correct
20 Correct 486 ms 17300 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 7 ms 4460 KB Output is correct
3 Correct 7 ms 4540 KB Output is correct
4 Correct 8 ms 4540 KB Output is correct
5 Correct 8 ms 4540 KB Output is correct
6 Correct 8 ms 4540 KB Output is correct
7 Correct 6 ms 4540 KB Output is correct
8 Correct 6 ms 4560 KB Output is correct
9 Correct 6 ms 4560 KB Output is correct
10 Correct 5 ms 4564 KB Output is correct
11 Correct 379 ms 16392 KB Output is correct
12 Correct 478 ms 16392 KB Output is correct
13 Correct 823 ms 16392 KB Output is correct
14 Correct 946 ms 16392 KB Output is correct
15 Correct 713 ms 16556 KB Output is correct
16 Correct 1020 ms 16556 KB Output is correct
17 Correct 1374 ms 16556 KB Output is correct
18 Correct 246 ms 17300 KB Output is correct
19 Correct 342 ms 17300 KB Output is correct
20 Correct 486 ms 17300 KB Output is correct
21 Correct 531 ms 17300 KB Output is correct
22 Correct 563 ms 17300 KB Output is correct
23 Correct 1569 ms 17300 KB Output is correct
24 Correct 1503 ms 18176 KB Output is correct
25 Correct 872 ms 20284 KB Output is correct
26 Correct 1756 ms 20284 KB Output is correct
27 Execution timed out 2045 ms 20284 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 7 ms 4460 KB Output is correct
3 Correct 7 ms 4540 KB Output is correct
4 Correct 8 ms 4540 KB Output is correct
5 Correct 8 ms 4540 KB Output is correct
6 Correct 8 ms 4540 KB Output is correct
7 Correct 6 ms 4540 KB Output is correct
8 Correct 6 ms 4560 KB Output is correct
9 Correct 6 ms 4560 KB Output is correct
10 Correct 5 ms 4564 KB Output is correct
11 Correct 96 ms 20284 KB Output is correct
12 Correct 121 ms 20284 KB Output is correct
13 Correct 299 ms 20284 KB Output is correct
14 Correct 479 ms 20284 KB Output is correct
15 Correct 197 ms 20284 KB Output is correct
16 Correct 479 ms 20284 KB Output is correct
17 Correct 1002 ms 20284 KB Output is correct
18 Correct 60 ms 20284 KB Output is correct
19 Correct 103 ms 20284 KB Output is correct
20 Correct 111 ms 20284 KB Output is correct
21 Correct 368 ms 20284 KB Output is correct
22 Correct 424 ms 20284 KB Output is correct
23 Correct 144 ms 20284 KB Output is correct
24 Correct 375 ms 20284 KB Output is correct
25 Correct 928 ms 20284 KB Output is correct
26 Correct 71 ms 20284 KB Output is correct
27 Correct 115 ms 20284 KB Output is correct
28 Correct 128 ms 20284 KB Output is correct
29 Correct 301 ms 20284 KB Output is correct
30 Correct 387 ms 20284 KB Output is correct
31 Correct 199 ms 20284 KB Output is correct
32 Correct 486 ms 20284 KB Output is correct
33 Correct 932 ms 20284 KB Output is correct
34 Correct 58 ms 20284 KB Output is correct
35 Correct 719 ms 20284 KB Output is correct
36 Correct 782 ms 20284 KB Output is correct
37 Correct 742 ms 20284 KB Output is correct
38 Correct 751 ms 20284 KB Output is correct
39 Correct 746 ms 20284 KB Output is correct
40 Correct 731 ms 20284 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4344 KB Output is correct
2 Correct 7 ms 4460 KB Output is correct
3 Correct 7 ms 4540 KB Output is correct
4 Correct 8 ms 4540 KB Output is correct
5 Correct 8 ms 4540 KB Output is correct
6 Correct 8 ms 4540 KB Output is correct
7 Correct 6 ms 4540 KB Output is correct
8 Correct 6 ms 4560 KB Output is correct
9 Correct 6 ms 4560 KB Output is correct
10 Correct 5 ms 4564 KB Output is correct
11 Correct 379 ms 16392 KB Output is correct
12 Correct 478 ms 16392 KB Output is correct
13 Correct 823 ms 16392 KB Output is correct
14 Correct 946 ms 16392 KB Output is correct
15 Correct 713 ms 16556 KB Output is correct
16 Correct 1020 ms 16556 KB Output is correct
17 Correct 1374 ms 16556 KB Output is correct
18 Correct 246 ms 17300 KB Output is correct
19 Correct 342 ms 17300 KB Output is correct
20 Correct 486 ms 17300 KB Output is correct
21 Correct 531 ms 17300 KB Output is correct
22 Correct 563 ms 17300 KB Output is correct
23 Correct 1569 ms 17300 KB Output is correct
24 Correct 1503 ms 18176 KB Output is correct
25 Correct 872 ms 20284 KB Output is correct
26 Correct 1756 ms 20284 KB Output is correct
27 Execution timed out 2045 ms 20284 KB Time limit exceeded
28 Halted 0 ms 0 KB -