QOJ.ac
QOJ
The 2nd Universal Cup Finals is coming! Check out our event page, schedule, and competition rules!
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#270364 | #6520. Classic Problem | C1942huangjiaxu | RE | 3ms | 20172kb | C++14 | 2.0kb | 2023-11-30 19:55:06 | 2023-11-30 19:55:06 |
Judging History
This is the latest submission verdict.
- [2023-12-06 00:08:28]
- hack成功,自动添加数据
- (//qoj.ac/hack/481)
- [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 ...