#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read() {
  T f = 0, x = 0;
  char c = getchar();
  while (!isdigit(c)) f = c == '-', c = getchar();
  while (isdigit(c)) x = x * 10 + c - 48, c = getchar();
  return f ? -x : x;
}
namespace run {
const int N = 5e5 + 9;
int n, a[N], L, R, suf[N], pos[N], nxt[N];
bool vis[N];
vector<int> Ls, Rs;
namespace Seg {
int mn[N << 3], tag[N << 2];
inline void pushup(int k) { mn[k] = min(mn[(k << 1)], mn[(k << 1 | 1)]); }
inline void pushdown(int k) {
  if (tag[k]) {
    mn[(k << 1)] += tag[k], mn[(k << 1 | 1)] += tag[k];
    tag[(k << 1)] += tag[k], tag[(k << 1 | 1)] += tag[k];
    tag[k] = 0;
  }
}
inline void build(int k, int l, int r) {
  tag[k] = 0;
  if (l == r) return mn[k] = suf[l], void();
  build((k << 1), l, ((l + r) >> 1)),
      build((k << 1 | 1), ((l + r) >> 1) + 1, r);
  pushup(k);
}
inline void modify(int k, int l, int r, int _l, int _r, int v) {
  if (_l <= l && r <= _r) return mn[k] += v, tag[k] += v, void();
  pushdown(k);
  if (_l <= ((l + r) >> 1)) modify((k << 1), l, ((l + r) >> 1), _l, _r, v);
  if (_r > ((l + r) >> 1))
    modify((k << 1 | 1), ((l + r) >> 1) + 1, r, _l, _r, v);
  pushup(k);
}
}  // namespace Seg
int main() {
  int T = read<int>();
  while (T--) {
    n = read<int>();
    int z = 0;
    for (int i = 1; i <= n; i++) z += !(a[i] = read<int>());
    R = 0;
    for (int i = 1, sum = !a[i]; i <= n; i++, sum += !a[i])
      if (sum >= z / 2) {
        R = i + 1;
        break;
      }
    L = R - 1;
    Ls.clear(), Rs.clear();
    for (int i = 1; i <= L; i++) vis[a[i]] = 0;
    for (int i = L; i >= 1; i--)
      if (a[i] && !vis[a[i]])
        Ls.push_back(a[i]), vis[a[i]] = 1;
      else if (!a[i])
        Ls.push_back(0);
    for (int i = n; i >= R; i--) vis[a[i]] = 0;
    for (int i = R; i <= n; i++)
      if (a[i] && !vis[a[i]])
        Rs.push_back(a[i]), vis[a[i]] = 1;
      else if (!a[i])
        Rs.push_back(0);
    reverse(Ls.begin(), Ls.end());
    for (int i = 0; i < Ls.size(); i++) pos[Ls[i]] = 0;
    for (int i = 0; i < Rs.size(); i++) pos[Rs[i]] = i + 1;
    suf[Rs.size() + 1] = 0;
    for (int i = Rs.size() - 1; ~i; i--) suf[i + 1] = suf[i + 2] + !Rs[i];
    for (int i = 0, ret = 0, tot = 0; i <= Rs.size(); i++) {
      suf[i + 1] += ret;
      if (i < Rs.size() && !Rs[i]) {
        ret += tot, tot = 0;
        for (int j = i - 1; ~j; j--)
          if (!Rs[j])
            break;
          else
            nxt[j + 1] = i + 1;
      } else
        tot++;
    }
    for (int j = Rs.size() - 1; ~j; j--)
      if (!Rs[j])
        break;
      else
        nxt[j + 1] = Rs.size() + 1;
    Seg::build(1, 1, Rs.size() + 1);
    int ret = 0, ans = n;
    for (int i = 0; i < Ls.size(); i++) ret += !Ls[i];
    static vector<int> hdl;
    hdl.clear();
    for (int i = Ls.size() - 1, tot = 0; i >= -1; i--) {
      ans = min(ans, ret + Seg::mn[1]);
      if (~i) {
        if (!Ls[i]) {
          ret--, ret += tot, tot = 0;
          while (hdl.size()) {
            if (hdl[hdl.size() - 1] <= Rs.size() + 1)
              Seg::modify(1, 1, Rs.size() + 1, hdl[hdl.size() - 1],
                          Rs.size() + 1, -1);
            hdl.pop_back();
          }
        } else {
          tot++;
          if (pos[Ls[i]]) hdl.push_back(nxt[pos[Ls[i]]] + 1);
        }
      }
    }
    printf("%d\n", min(z / 2, ans));
  }
  return 0;
}
}  // namespace run
int main() { return run::main(); }
