#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10, size = 1 << 20;
char buf[size], *p1 = buf, *p2 = buf;
template <class o>
void qr(o& x) {
  char c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, size, stdin), p1 == p2)
                ? EOF
                : *p1++);
  x = 0;
  int f = 1;
  while (!isdigit(c)) {
    if (c == '-') f = -1;
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, size, stdin), p1 == p2)
             ? EOF
             : *p1++);
  }
  while (isdigit(c))
    x = x * 10 + c - '0',
    c = (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, size, stdin), p1 == p2)
             ? EOF
             : *p1++);
  x *= f;
}
template <class o>
void qw(o x) {
  if (x / 10) qw(x / 10);
  putchar(x % 10 + '0');
}
template <class o>
void pr1(o x) {
  if (x < 0) x = -x, putchar('-');
  qw(x);
  putchar(' ');
}
template <class o>
void pr2(o x) {
  if (x < 0) x = -x, putchar('-');
  qw(x);
  putchar(10);
}
int n, a[N], ans, L[N], R[N], first[N];
void solve() {
  qr(n);
  vector<int> zero;
  ans = 0;
  for (auto i = 1; i <= n; i++) {
    qr(a[i]);
    first[i] = 0;
    if (!a[i]) zero.push_back(i);
  }
  if (((int)zero.size()) < 2) {
    puts("0");
    return;
  }
  int z = zero[((int)zero.size()) / 2];
  for (auto i = 1; i <= z - 1; i++) first[a[i]] = i;
  priority_queue<pair<int, int> > q;
  for (auto i = z; i <= n; i++) {
    if (!a[i]) {
      if (q.size()) {
        first[q.top().second] = -1;
        q.pop();
        ans++;
      }
    } else {
      if (first[a[i]] >= 0)
        q.push(make_pair(-first[a[i]], a[i])), first[a[i]] = -2;
    }
  }
  int cnt = 0;
  for (auto i = z - 1; i >= 1; i--) {
    if (!a[i]) {
      if (cnt) ans++, cnt--;
    } else if (first[a[i]] != -1)
      cnt++, first[a[i]] = -1;
  }
  pr2(min(ans, ((int)zero.size()) / 2));
}
int main() {
  int T = 1;
  qr(T);
  while (T--) solve();
  return 0;
}
