比赛 2025新春开学欢乐赛 评测结果 AAAAAAAAAA
题目名称 t2 最终得分 100
用户昵称 flyfreem 运行时间 2.114 s
代码语言 C++ 内存使用 14.37 MiB
提交时间 2025-02-15 17:35:00
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define MAXN 300010
  5. // By flyfreemrn
  6. inline ll read(){
  7. ll x=0,f=1;
  8. char c=getchar();
  9. while(c<'0'||c>'9'){
  10. if(c=='-')f=-1;
  11. c=getchar();
  12. }
  13. while(c>='0'&&c<='9'){
  14. x=x*10+c-'0';
  15. c=getchar();
  16. }
  17. return x*f;
  18. }
  19. inline void write(ll x){
  20. if(x>9)write(x/10);
  21. putchar(x%10+'0');
  22. }
  23. struct node_line{
  24. ll x,y,w;
  25. }line1[MAXN],line2[MAXN];
  26. bool cmp(node_line a,node_line b){
  27. return a.w<b.w;
  28. }
  29. struct node_dsu{
  30. ll fa[MAXN],siz;
  31. ll find(ll x){
  32. return (fa[x]==x)?x:fa[x]=find(fa[x]);
  33. }
  34. void merge(ll x,ll y){
  35. x=find(x),y=find(y);
  36. if(x!=y)fa[x]=y,siz--;
  37. }
  38. void build(ll x){
  39. siz=x;
  40. for(int i=1;i<=x;i++)fa[i]=i;
  41. }
  42. }dsu1,dsu2;
  43. ll n1,n2,m1,m2;
  44. ll ans;
  45. int main(){
  46. freopen("emptyfist.in","r",stdin);
  47. freopen("emptyfist.out","w",stdout);
  48. n1=read(),n2=read(),m1=read(),m2=read();
  49. for(int i=1;i<=m1;i++)line1[i].x=read(),line1[i].y=read(),line1[i].w=read();
  50. for(int i=1;i<=m2;i++)line2[i].x=read(),line2[i].y=read(),line2[i].w=read();
  51. sort(line1+1,line1+1+m1,cmp);
  52. sort(line2+1,line2+1+m2,cmp);
  53. dsu1.build(n1),dsu2.build(n2);
  54. ll l1=1,l2=1;
  55. for(int i=1;i<=m1+m2;i++){
  56. if(l1<=m1&&dsu1.find(line1[l1].x)==dsu1.find(line1[l1].y)){
  57. l1++;continue;
  58. }else if(l2<=m2&&dsu2.find(line2[l2].x)==dsu2.find(line2[l2].y)){
  59. l2++;continue;
  60. }else{
  61. ll val1=dsu2.siz*line1[l1].w,val2=dsu1.siz*line2[l2].w;
  62. if(l1<=m1&&(l2>m2||line2[l2].w>line1[l1].w)){
  63. dsu1.merge(line1[l1].x,line1[l1].y);
  64. ans+=val1;
  65. // cout<<1<<" "<<line1[l1].x<<" "<<line1[l1].y<<endl;
  66. l1++;
  67. }else{
  68. dsu2.merge(line2[l2].x,line2[l2].y);
  69. ans+=val2;
  70. // cout<<2<<" "<<line2[l2].x<<" "<<line2[l2].y<<endl;
  71. l2++;
  72. }
  73. }
  74. }
  75. cout<<ans<<endl;
  76. return 0;
  77. }
  78.