因为题目规定

  1. 任意相邻的两步,玩家不同(一黑一白);

  2. 任意相邻的两步,不能下在同一个劫争处。 我们只需要对每个操作枚举一下a:dp[i]=max(dp[i],dp[pre[j][k]]+1);a,状态转移方程:dp[i] = max(dp[i],dp[pre[j][k]] + 1);\\ pre[j][k]:jkpre[j][k]:j人在k劫争处下棋时在第几轮\\ dp[i]:idp[i]:到第i轮为止最长的合法行棋子序列长度\\ 口胡一下:对于第cc个人,下在第aa个位置,这一轮他的最有情况一定是另外一个人,下在除了aa以外的其他位置的最优情况下+1

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<iomanip>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
 
# define eps 1e-9
# define fi first
# define se second
# define ll long long
# define int ll
// cout<<fixed<<setprecision(n) 
using namespace std;
 
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=1e5+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int T,n,dp[MAX],pre[2][15];

void solve(){
	  int ans = 0;
      cin >> n;
      memset(dp,0,sizeof dp);
      memset(pre,0,sizeof pre);
      for(int i = 1 ; i <= n  ; i ++ ){
      	  int c,a;
      	  cin >> c >> a;
      	  for(int j = 0 ; j < 2 ; j ++ )
      	   if(j != c){
      	   	    for(int k = 1 ; k <= 10 ; k ++ )
      	   	     if(k != a) dp[i] = max(dp[i],dp[pre[j][k]] + 1);
			 }
		  
		  pre[c][a] = i;
		  ans = max(ans,dp[i]);
	  }
	  cout<<ans<<"\n";
}


signed main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> T;
    while(T--){
    	solve();
	}

    return 0;
}