比赛 |
2025新春开学欢乐赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
t2 |
最终得分 |
100 |
用户昵称 |
flyfreem |
运行时间 |
2.114 s |
代码语言 |
C++ |
内存使用 |
14.37 MiB |
提交时间 |
2025-02-15 17:35:00 |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define MAXN 300010
- // By flyfreemrn
- inline ll read(){
- ll x=0,f=1;
- char c=getchar();
- while(c<'0'||c>'9'){
- if(c=='-')f=-1;
- c=getchar();
- }
- while(c>='0'&&c<='9'){
- x=x*10+c-'0';
- c=getchar();
- }
- return x*f;
- }
- inline void write(ll x){
- if(x>9)write(x/10);
- putchar(x%10+'0');
- }
- struct node_line{
- ll x,y,w;
- }line1[MAXN],line2[MAXN];
- bool cmp(node_line a,node_line b){
- return a.w<b.w;
- }
- struct node_dsu{
- ll fa[MAXN],siz;
- ll find(ll x){
- return (fa[x]==x)?x:fa[x]=find(fa[x]);
- }
- void merge(ll x,ll y){
- x=find(x),y=find(y);
- if(x!=y)fa[x]=y,siz--;
- }
- void build(ll x){
- siz=x;
- for(int i=1;i<=x;i++)fa[i]=i;
- }
- }dsu1,dsu2;
- ll n1,n2,m1,m2;
- ll ans;
- int main(){
- freopen("emptyfist.in","r",stdin);
- freopen("emptyfist.out","w",stdout);
- n1=read(),n2=read(),m1=read(),m2=read();
- for(int i=1;i<=m1;i++)line1[i].x=read(),line1[i].y=read(),line1[i].w=read();
- for(int i=1;i<=m2;i++)line2[i].x=read(),line2[i].y=read(),line2[i].w=read();
- sort(line1+1,line1+1+m1,cmp);
- sort(line2+1,line2+1+m2,cmp);
- dsu1.build(n1),dsu2.build(n2);
- ll l1=1,l2=1;
- for(int i=1;i<=m1+m2;i++){
- if(l1<=m1&&dsu1.find(line1[l1].x)==dsu1.find(line1[l1].y)){
- l1++;continue;
- }else if(l2<=m2&&dsu2.find(line2[l2].x)==dsu2.find(line2[l2].y)){
- l2++;continue;
- }else{
- ll val1=dsu2.siz*line1[l1].w,val2=dsu1.siz*line2[l2].w;
- if(l1<=m1&&(l2>m2||line2[l2].w>line1[l1].w)){
- dsu1.merge(line1[l1].x,line1[l1].y);
- ans+=val1;
- // cout<<1<<" "<<line1[l1].x<<" "<<line1[l1].y<<endl;
- l1++;
- }else{
- dsu2.merge(line2[l2].x,line2[l2].y);
- ans+=val2;
- // cout<<2<<" "<<line2[l2].x<<" "<<line2[l2].y<<endl;
- l2++;
- }
- }
- }
- cout<<ans<<endl;
- return 0;
- }
-