唐!
查看原帖
唐!
817925
whileAK楼主2024/7/7 16:05

被卡常,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;

}
2024/7/7 16:05
加载中...