#include <bits/stdc++.h>
const int max_N = 5e5 + 5;
int t, n, a[max_N], zero[max_N], Lmax[max_N], Rmin[max_N];
bool flag[max_N];
int read() {
  long long ans = 0;
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  while (c >= '0' && c <= '9') ans = ans * 10 + c - '0', c = getchar();
  return ans;
}
void Write(int x) {
  if (x < 10)
    putchar(x + '0');
  else
    Write(x / 10), putchar(x % 10 + '0');
}
int min(int x, int y) { return x < y ? x : y; }
int max(int x, int y) { return x > y ? x : y; }
int solve() {
  std::priority_queue<std::pair<int, int> > Q;
  *zero = 0;
  for (int i = 1; i <= n; i++) flag[i] = 0, Lmax[i] = -1, Rmin[i] = n + 1;
  for (int i = 1; i <= n; i++)
    if (a[i] == 0) zero[++*zero] = i;
  if (*zero < 2) return 0;
  int mid = zero[(*zero + 1) / 2], ans = 0, tmp = 0;
  for (int i = 1; i <= mid; i++)
    if (a[i]) Lmax[a[i]] = max(Lmax[a[i]], i);
  for (int i = mid + 1; i <= n; i++)
    if (a[i]) Rmin[a[i]] = min(Rmin[a[i]], i);
  int cntL = (*zero + 1) / 2, cntR = *zero - cntL;
  for (int i = mid; i; i--)
    if (a[i] && Lmax[a[i]] == i)
      Q.push(std::make_pair(Rmin[a[i]], a[i]));
    else if (!a[i] && Q.size() && cntR)
      cntL--, cntR--, tmp++, ans++, flag[Q.top().second] = true, Q.pop();
  for (int i = mid + 1; i <= n && cntL && cntR; i++) {
    if (a[i] && Rmin[a[i]] == i && !flag[a[i]])
      cntL--, cntR--, tmp++, ans++, flag[a[i]] = true;
    if (a[i] == 0) {
      if (tmp)
        tmp--;
      else
        cntR--;
    }
  }
  return ans;
}
int main() {
  t = read();
  while (t--) {
    n = read();
    for (int i = 1; i <= n; i++) a[i] = read();
    Write(solve()), putchar('\n');
  }
  return 0;
}
