QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#796047#9806. Growing Treeucup-team191#WA 1ms4164kbC++233.4kb2024-12-01 06:59:042024-12-01 06:59:04

Judging History

你现在查看的是最新测评结果

  • [2024-12-01 06:59:04]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:4164kb
  • [2024-12-01 06:59:04]
  • 提交

answer

#include <cstdio>
#include <vector>
#include <algorithm>

#define PB push_back

using namespace std;

typedef vector < int > vi;

const int OFF = (1 << 11) + 1;
const int N = 1000;

int n, T[2 * OFF], pos[2 * OFF], list[2 * OFF];
vector < int > v[2 * OFF];

bool inter(vi &A, vi &B) {
	int i = 0, j = 0;
	while(i < (int)A.size() && j < (int)B.size()) {
		if(A[i] == B[j]) return true;
		else if(A[i] < B[j]) i++;
		else j++;
	}
	return false;
}

int ban[N], cur_sub[2 * OFF];
int off, kolko_rezo, ans;
vector < int > makni;

vector < int > koga;

void brute(int ind) {
	if(ind == (int)makni.size()) {
		ans = min(ans, kolko_rezo);
		//for(int x : koga)
		//	printf("%d ", x);
		//printf("\n");
		return;
	}
	int x = makni[ind];
	int L = cur_sub[2 * x];
	int R = cur_sub[2 * x + 1];
	bool dobar = true;
	for(;L; L -= L & -L) {
		if(ban[__lg(L & -L)] & R) {
			dobar = false; break;
		}
	}
	if(dobar) {
		brute(ind + 1);
	} else if(kolko_rezo < n - __lg(x)){
		kolko_rezo++;
		koga.PB(2 * x);
		for(int y = x;y >= 1;y >>= 1)
			cur_sub[y] ^= cur_sub[2 * x];
		brute(ind + 1);
		koga.pop_back();
		koga.PB(2 * x + 1);
		for(int y = x;y >= 1;y >>= 1)
			cur_sub[y] ^= cur_sub[2 * x] ^ cur_sub[2 * x + 1];
		brute(ind + 1);
		for(int y = x;y >= 1;y >>= 1)
			cur_sub[y] ^= cur_sub[2 * x + 1];
		koga.pop_back();
		kolko_rezo--;
	}
}

void ocisti() {
	
	
	for(int i = 0;i <= 2 * off;i++) {
		v[i].clear(); 
		cur_sub[i] = 0; list[i] = 0; 
		pos[i] = 0; T[i] = 0;
	}
	for(int i = 0;i < N;i++) {
		ban[i] = 0;
	}
	
	makni.clear();
	
}

void solve() {
	scanf("%d", &n);
	off = (1 << n);
	for(int i = 2;i < 2 * off;i++) {
		scanf("%d", T + i);
	}
	for(int i = 2;i < off;i++) T[2 * i] += T[i], T[2 * i + 1] += T[i];
	
	//printf("T : ");
	//for(int i = off;i < 2 * off;i++) printf("%d ", T[i]);
	//printf("\n");
	
	for(int i = off;i < 2 * off;i++) {
		v[i].PB(T[i]);
	}
	for(int i = off - 1;i >= 1;i--) {
		for(int x : v[2 * i]) v[i].PB(x);
		for(int x : v[2 * i + 1]) v[i].PB(x);
		sort(v[i].begin(), v[i].end());
		v[i].erase(unique(v[i].begin(), v[i].end()), v[i].end());
		pos[i] = (int)v[i].size() < (1 << (n - __lg(i)));
	}
	
	if(!pos[1]) {
		printf("0\n");
		ocisti();
		return;
	}
	vector < int > listovi;
	for(int i = 1;i < 2 * off;i++) {
		if(pos[i]) makni.PB(i);
		else if(pos[i >> 1]) {
			cur_sub[i] = 1 << ((int)listovi.size());
			//printf("listovi[ %d ] = %d\n", (int)listovi.size(), i);
			listovi.PB(i);
			list[i] = 1;
		}
	}
	reverse(makni.begin(), makni.end());
	
	if((int)makni.size() > 2 * n || (int)listovi.size() > 25) {
		printf("-1\n");
		ocisti();
		return;
	}
	int m = (int)listovi.size();
	for(int i = 0;i < m;i++) {
		//printf("list[ %d|%d ] : ", i, listovi[i]);
		//for(int x : v[listovi[i]]) printf("%d ", x);
		///printf("\n");
		for(int j = i + 1;j < m;j++) {
			if(inter(v[listovi[i]], v[listovi[j]])) {
				//printf(" (%d %d) \n", listovi[i], listovi[j]);
				ban[i] |= (1 << j);
				ban[j] |= (1 << i);
			}
		}
	}
	
	for(int i = 2 * off - 1;i >= 1;i--) {
		if(pos[i]) {
			cur_sub[i] = cur_sub[2 * i] | cur_sub[2 * i + 1];
		}
	}
	
	ans = 100;
	kolko_rezo = 0;
	brute(0);
	
	if(ans == 100) {
		printf("-1\n");
	} else {
		printf("%d\n", ans);
	}
	
	ocisti();
}

int main() {
	int T; scanf("%d", &T);
	for(;T--;) {
		solve();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3816kb

input:

3
2
1 2 4 3 2 1
2
1 2 3 3 2 1
2
1 2 3 3 1 1

output:

1
2
-1

result:

ok 3 number(s): "1 2 -1"

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 4164kb

input:

94
5
44 65 38 61 64 94 71 53 65 10 24 36 98 74 11 4 5 46 72 34 9 24 37 32 76 29 48 88 17 14 36 4 22 6 71 53 24 61 89 79 39 57 99 61 27 85 99 46 81 75 90 25 16 13 1 87 55 81 56 78 67 2
3
83 3 74 14 45 17 22 41 62 74 25 1 56 22
7
21 73 83 99 3 91 16 53 8 10 49 29 54 81 45 10 12 68 32 9 30 11 99 85 73 ...

output:

2
0
-1
2
0
1
-1
0
0
3
0
0
0
1
2
1
0
2
0
1
0
-1
0
-1
0
0
-1
-1
-1
-1
-1
4
-1
0
3
2
7
-1
-1
-1
1
2
4
0
0
2
7
1
6
0
-1
2
-1
0
0
0
-1
1
-1
-1
0
0
1
1
-1
0
1
2
0
-1
0
0
1
1
-1
0
-1
0
0
0
-1
3
-1
1
-1
0
0
0
0
1
0
-1
3
3

result:

wrong answer 85th numbers differ - expected: '7', found: '-1'