QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#796047 | #9806. Growing Tree | ucup-team191# | WA | 1ms | 4164kb | C++23 | 3.4kb | 2024-12-01 06:59:04 | 2024-12-01 06:59:04 |
Judging History
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'