QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#270364#6520. Classic ProblemC1942huangjiaxuRE 3ms20172kbC++142.0kb2023-11-30 19:55:062023-11-30 19:55:06

Judging History

This is the latest submission verdict.

  • [2023-11-30 19:55:06]
  • Judged
  • Verdict: RE
  • Time: 3ms
  • Memory: 20172kb
  • [2023-11-30 19:55:06]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
const int N=4e5+5;
typedef long long ll;
ll ans;
int T,n,m,a[N],ca,fa[N],pl[N],pr[N],cp,va[N],iv[N],id[N],cnt,p1[N],p2[N],f1[N],f2[N];
map<pair<int,int>,int>mp;
struct edge{
	int x,y,z;
}e[N];
int gf(int *fa,int x){
	return fa[x]==x?fa[x]:fa[x]=gf(fa,fa[x]);
}
void solve(){
	scanf("%d%d",&n,&m);
	for(int i=1,x,y,z;i<=m;++i){
		scanf("%d%d%d",&x,&y,&z);
		a[++ca]=x,a[++ca]=y;
		e[i]={x,y,z};
	}
	sort(a+1,a+ca+1);
	ca=unique(a+1,a+ca+1)-a-1,cp=ans=0;
	for(int i=1;i<=ca;++i){
		if(a[i]!=a[i-1]+1)++cp,pl[cp]=a[i-1]+1,pr[cp]=a[i]-1;
		++cp,pl[cp]=pr[cp]=a[i],id[i]=cp;
	}
	mp.clear();
	for(int i=1;i<=m;++i){
		e[i].x=id[lower_bound(a+1,a+ca+1,e[i].x)-a];
		e[i].y=id[lower_bound(a+1,a+ca+1,e[i].y)-a];
		mp[make_pair(e[i].x,e[i].y)]=e[i].z;
	}
	if(a[ca]!=n)++cp,pl[cp]=a[ca]+1,pr[cp]=n;
	for(int i=1;i<=cp;++i)fa[i]=i,ans+=pr[i]-pl[i],p1[i]=i-1,p2[i]=i+1,f1[i]=i,f2[i]=i;
	cnt=cp;
	while(cnt>1){
		for(int i=1;i<=cp;++i)va[i]=1e9+7,iv[i]=0;
		for(int i=1;i<=cp;++i){
			int u=gf(fa,i);
			while(p1[i]&&(gf(fa,p1[i])==u||mp.count(make_pair(p1[i],i)))){
				--p1[i];
				if(p1[i])p1[i]=gf(f1,p1[i]);
			}
			if(p1[i]&&va[u]>pl[i]-pr[p1[i]]){
				va[u]=pl[i]-pr[p1[i]];
				iv[u]=gf(fa,p1[i]);
			}
			while(p2[i]<=cp&&(gf(fa,p2[i])==u||mp.count(make_pair(i,p2[i])))){
				++p2[i];
				if(p2[i]<=cp)p2[i]=gf(f2,p2[i]);
			}
			if(p2[i]<=cp&&va[u]>pl[p2[i]]-pr[i]){
				va[u]=pl[p2[i]]-pr[i];
				iv[u]=gf(fa,p2[i]);
			}
		}
		for(int i=1;i<=m;++i){
			int u=gf(fa,e[i].x),v=gf(fa,e[i].y);
			if(u==v)continue;
			if(va[u]>e[i].z)va[u]=e[i].z,iv[u]=v;
			if(va[v]>e[i].z)va[v]=e[i].z,iv[v]=u;
		}
		for(int i=1;i<=cp;++i)if(fa[i]==i)fa[gf(fa,iv[i])]=i,ans+=va[i];
		for(int i=1;i<=cp;++i){
			if(i>1&&f1[i]==i&&gf(fa,i-1)==gf(fa,i))f1[i]=f1[i-1];
			if(i<cp&&f2[i]==i&&gf(fa,i+1)==gf(fa,i))f2[i]=f2[i+1];
		}
		cnt=0;
		for(int i=1;i<=cp;++i)if(fa[i]==i)++cnt;
	}
	printf("%lld\n",ans);
}
int main(){
	scanf("%d",&T);
	while(T--)solve();
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 20172kb

input:

3
5 3
1 2 5
2 3 4
1 5 0
5 0
5 4
1 2 1000000000
1 3 1000000000
1 4 1000000000
1 5 1000000000

output:

4
4
1000000003

result:

ok 3 number(s): "4 4 1000000003"

Test #2:

score: -100
Runtime Error

input:

16
1000000000 0
447 99681
1 2 1000000000
1 3 1000000000
2 3 1000000000
1 4 1000000000
2 4 1000000000
3 4 1000000000
1 5 1000000000
2 5 1000000000
3 5 1000000000
4 5 1000000000
1 6 1000000000
2 6 1000000000
3 6 1000000000
4 6 1000000000
5 6 1000000000
1 7 1000000000
2 7 1000000000
3 7 1000000000
4 7 ...

output:


result: