赛时没调出来.....
wa on #2
可能有点难看懂,希望有大佬能给个 hack。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
template<class T>
void ckmx(T& a,T b){
a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
a=min(a,b);
}
template<class T>
T gcd(T a,T b){
return !b?a:gcd(b,a%b);
}
template<class T>
T lcm(T a,T b){
return a/gcd(a,b)*b;
}
#define gc getchar()
#define eb emplace_back
#define pc putchar
#define ep empty()
#define fi first
#define se second
#define pln pc('\n');
const int maxn=3e5+5;
int n,m;
vi seq[maxn];
int l[maxn];
pii get(vi& seq){
map<int,int> vis;
for(int& v:seq){
vis[v]=1;
}
int mex=0;
while(vis[mex])mex++;
int semex=mex+1;
while(vis[semex])semex++;
return mkpr(mex,semex);
}
ll gas(ll fir,ll _ed){
return (fir+_ed)*(_ed-fir+1)/2ll;
}
struct Disc{
int disc[maxn*2],top;
void add(int x){
disc[++top]=x;
}
void bd(){
sort(disc+1,disc+top+1);
top=unique(disc+1,disc+top+1)-disc-1;
}
int rk(int x){
return lower_bound(disc+1,disc+top+1,x)-disc;
}
int val(int x){
return disc[x];
}
void init(){
top=0;
}
}disc;
int up[maxn],dw[maxn];
map<int,int> spe_calc;
vi g[maxn*2];
int ind[maxn*2];
void solve(int id_of_test){
scanf("%lld%lld",&n,&m);
FOR(i,1,n){
scanf("%lld",&l[i]);
FOR(j,1,l[i]){
int nw;
scanf("%lld",&nw);
seq[i].eb(nw);
}
auto tmp=get(seq[i]);
dw[i]=tmp.fi;
up[i]=tmp.se;
disc.add(dw[i]);
disc.add(up[i]);
}
disc.bd();
FOR(i,1,n){
dw[i]=disc.rk(dw[i]);
up[i]=disc.rk(up[i]);
g[up[i]].eb(dw[i]);
ind[dw[i]]++;
}
queue<int> q;
FOR(i,1,disc.top){
if(!ind[i]){
q.push(i);
spe_calc[disc.val(i)]=disc.val(i);
}
}
while(!q.empty()){
int u=q.front();
q.pop();
int dpu=spe_calc[disc.val(u)];
for(int& v:g[u]){
ind[v]--;
ckmx(spe_calc[disc.val(v)],dpu);
if(!ind[v]){
q.push(v);
}
}
}
int global_mx=0;
map<int,int> dwct;
FOR(i,1,n){
if(dwct.find(dw[i])!=dwct.end()){
ckmx(dwct[dw[i]],max(disc.val(up[i]),spe_calc[disc.val(up[i])]));
ckmx(global_mx,dwct[dw[i]]);
}
ckmx(dwct[dw[i]],max(disc.val(up[i]),spe_calc[disc.val(up[i])]));
}
ll ans;
//printf("globalmx = %d\n",global_mx);
if(global_mx>=m){
ans=(ll)global_mx*ll(m+1);
}else{
ans=(ll)global_mx*ll(global_mx+1ll)+gas(global_mx+1,m);
}
for(auto [x,val]:spe_calc){
// printf("%d: %d\n",x,val);
ans-=(ll)max(x,global_mx);
ans+=(ll)max(max(x,global_mx),val);
}
printf("%lld\n",ans);
// clear
FOR(i,1,n){
seq[i].clear();
}
FOR(i,1,disc.top){
g[i].clear();
ind[i]=0;
}
disc.init();
spe_calc.clear();
}
signed main()
{
int T;
scanf("%lld",&T);
FOR(_,1,T){
solve(_);
}
return 0;
}