被卡常,set常数太大导致的。强神求调,悬关。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
int f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
void rdl(ll &p){
ll f=1;p=0;char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
p*=f;
}
const int N=1e6+50;
int t,n,li[N],cnt,f[N];
int gt(int x){
return x==f[x]?x:gt(f[x]);
}
void merg(int x,int y){
x=gt(x),y=gt(y);
f[x]=y;
}
struct tr{
int l,r,val;
bool operator<(const tr &x)const{
return l<x.l;
}
}a[N];
vector<int>v[N],w[N];
struct qu{
int x,y,val;
bool operator<(const qu &u)const{
return u.val<val;
}
};
priority_queue<qu>q;
struct se{
int val,id;
bool operator<(const se &x)const{
if(val!=x.val)return val<x.val;
return id<x.id;
}
};
multiset<se>s;
int main(){
rd(t);while(t--){
rd(n);
for(int i(1);i<=n;++i){
rd(a[i].l);rd(a[i].r);rd(a[i].val);li[i]=a[i].l;li[i+n]=a[i].r;
}sort(a+1,a+n+1);sort(li+1,li+2*n+1);cnt=0;
for(int i(1);i<=2*n;++i)if(li[i]!=li[cnt])li[++cnt]=li[i];
for(int i(1);i<=n;++i){
a[i].l=lower_bound(li+1,li+cnt+1,a[i].l)-li;
a[i].r=lower_bound(li+1,li+cnt+1,a[i].r)-li;
}
for(int i(1);i<=cnt;++i)v[i].clear(),w[i].clear();
for(int i(1);i<=n;++i){
v[a[i].l].push_back(i);w[a[i].r].push_back(i);
}s.clear();
std::set<se>::iterator it;
for(int i(1),x,uu,uuu;i<=cnt;++i){
for(int j(0);j<v[i].size();++j){
x=v[i][j];
it=s.lower_bound(se{a[x].val,0});
if(it!=s.end()&&it->val==a[x].val){
q.push(qu{it->id,x,0});++it;
if(it!=s.end()){
if(it->val==a[x].val)q.push(qu{it->id,x,0});
else{
uu=it->val-a[x].val;--it;
if(it!=s.begin()){
--it;uuu=a[x].val-it->val;
}else uuu=1e9+9;
if(uu>uuu)q.push(qu{it->id,x,uuu});
else{
if(uuu!=1e9+9)++it;++it;q.push(qu{it->id,x,uu});
}
}
}
else{--it;
if(it!=s.begin()){
--it;q.push(qu{it->id,x,a[x].val-it->val});
}
}
}
else{
if(it!=s.begin()){
--it;q.push(qu{it->id,x,a[x].val-it->val});++it;
}
if(it!=s.end())q.push(qu{it->id,x,it->val-a[x].val});
}
s.insert(se{a[x].val,x});
}
for(int j(0);j<w[i].size();++j){
s.erase(se{a[w[i][j]].val,w[i][j]});
}
}
qu u;int ct(0);ll ans(0);
for(int i(1);i<=n;++i)f[i]=i;
while(q.size()){
u=q.top();q.pop();
if(gt(u.x)!=gt(u.y)){
ans+=1ll*u.val;merg(u.x,u.y);++ct;
}
}
if(ct==n-1)printf("%lld\n",ans);
else printf("-1\n");
}
return 0;
}