看标程的代码这么短,看我的....

难道是静态LCA模板太长了?

/*
HDU 6074 - Phone Call [ LCA,并查集 ]  |  2017 Multi-University Training Contest 4
题意:给一棵树,定义集合S(u,v)为u到v路径上所有的点给出 m 个 <S(u1,v1)|S(u2,v2) , w > ,意思为集合里面的点互相距离为 w 求 1 能到的所有点和该生成树的最小权值
分析:将所有线路按代价从小到大排序,对于每条线路(a,b,c,d)分别把S(a,b)和S(c,d)合并到 LCA,最后再把两个 LCA 合并即可再用f(i)表示i向上第一个与i不在同一个连通块的点, 就可用并查集压缩路径
*/
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 100005;
const int Q = 200005;
vector<int> G[N];
namespace LCA{struct Query {int v, q;}; vector <Query> query[N];int ans[Q], f[N], vis[N];int sf(int x) {return x == f[x] ? x : f[x] = sf(f[x]);}void init() {memset(ans, -1, sizeof(ans));for (int i = 0; i < N; i++) {vis[i] = 0;f[i] = i;query[i].clear();}}void adq(int u, int v, int id) {query[u].push_back(Query{v, id});query[v].push_back(Query{u, id});}void LCA(int u) {f[u] = u;vis[u] = 1;for (auto& x : query[u]) {if (vis[x.v] && ans[x.q] == -1)ans[x.q] = sf(x.v);}for (auto& v : G[u]) {if (vis[v]) continue;LCA(v);f[v] = u;}}
}
int pre[N];
void dfs(int u, int fa) {pre[u] = fa;for (auto v : G[u]) {if (v == fa) continue;dfs(v, u);}
}
int f[N], num[N];
LL res[N];
int sf(int x){return x == f[x] ? x : f[x] = sf(f[x]);
}
int same[N];
int Same(int x) {return x == same[x] ? x : same[x] = Same(same[x]);
}
int w;
void join(int a, int b){a = sf(a), b = sf(b);if (a == b) return;f[b] = a;num[a] += num[b];res[a] += res[b] + w;
}
struct Node {int a1, b1, a2, b2, w;int c1, c2;
}e[N];
bool cmp(Node a, Node b) {return a.w < b.w;
}
void solve(int a, int fa) {while (Same(a) != Same(fa)) {a = Same(a);join(pre[a], a);same[a] = pre[a];}
}
int t, n, m;
int main() {scanf("%d", &t);while (t--) {for (int i = 0; i < N; i++) G[i].clear();LCA::init();scanf("%d%d", &n, &m);for (int i = 1; i < n; i++) {int u, v; scanf("%d%d", &u, &v);G[u].push_back(v);G[v].push_back(u);}int Q = 0;for (int i = 1; i <= m; i++) {scanf("%d%d%d%d%d", &e[i].a1, &e[i].b1, &e[i].a2, &e[i].b2, &e[i].w);e[i].c1 = ++Q;LCA::adq(e[i].a1, e[i].b1, Q);e[i].c2 = ++Q;LCA::adq(e[i].a2, e[i].b2, Q);}LCA::LCA(1);for (int i = 1; i <= m; i++) {e[i].c1 = LCA::ans[e[i].c1];e[i].c2 = LCA::ans[e[i].c2];}dfs(1, 1);sort(e+1, e+m+1, cmp);for (int i = 1; i <= n; i++) {f[i] = same[i] = i;num[i] = 1;res[i] = 0;}for (int i = 1; i <= m; i++) {w = e[i].w;solve(e[i].a1, e[i].c1);solve(e[i].b1, e[i].c1);solve(e[i].a2, e[i].c2);solve(e[i].b2, e[i].c2);join(e[i].c1, e[i].c2);}printf("%d %lld\n", num[sf(1)], res[sf(1)]);}
}

  

转载于:https://www.cnblogs.com/nicetomeetu/p/7301983.html

HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4相关推荐

  1. 9行代码AC——HDU 6857 -Clockwise or Counterclockwise(2020 Multi-University Training Contest 8)(判断三点顺序)

    励志用尽量少的代码做高效表达 Problem Description It is preferrable to read the pdf statment. After some basic geom ...

  2. HDU 6386 Age of Moyu 2018 Multi-University Training Contest 7(最短路径dijkstra)

    Age of Moyu 题意:第一行给出n,m,接下来有m条路,每一行给出 a b c ,从a到b 是c掌控. 若下一条路与上一条路不属于一个c,需要缴费1. 输出从1到N的最小花费,不通则输出-1 ...

  3. HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5

    思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Conte ...

  4. HDU 6051 - If the starlight never fade | 2017 Multi-University Training Contest 2

    /* HDU 6051 - If the starlight never fade [ 原根,欧拉函数 ] | 2017 Multi-University Training Contest 2 题意: ...

  5. HDU 6058 - Kanade's sum | 2017 Multi-University Training Contest 3

    /* HDU 6058 - Kanade's sum [ 思维,链表 ] | 2017 Multi-University Training Contest 3 题意:给出排列 a[N],求所有区间的第 ...

  6. 2017 Multi-University Training Contest - Team 3 Kanade's sum hd6058

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6058 题目: Kanade's sum Time Limit: 4000/2000 MS (J ...

  7. hdu 4925 Apple Tree--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...

  8. 2017 Multi-University Training Contest - Team 1

    2017 Multi-University Training Contest - Team 1 01     签到的 #include<bits/stdc++.h> using names ...

  9. 2017 Multi-University Training Contest - Team 7:1003. Color the chessboard(...)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

  10. 2017 Multi-University Training Contest - Team 7:1002. Build a tree(递归)

    其他题目题解: 2017 Multi-University Training Contest - Team 7:1005. Euler theorem 2017 Multi-University Tr ...

最新文章

  1. 有什么事是你当了程序员才知道的? | 每日趣闻
  2. 11gR2 RAC GoldenGate的HA配置
  3. bms_output.put_line使用方法
  4. 2019年信息安全工程师备考经验
  5. xadmin 显示外键字段
  6. VB.net中的sender和e
  7. opencv:基于颜色空间的肤色检测方法
  8. 起面的英怯——幸运的舆图
  9. 人工智能:状态空间图(超详细经典例题讲解,通过例题教会你如何解决状态空间图问题)
  10. html设置网页的大小怎么设置方法,网页字体大小怎么样去设置
  11. 最长重复子字符串:123321||12321
  12. vim命令模式和底线_VIM 底线命令模式
  13. 自适应模糊PID在反应釜温度控制中的应用
  14. WinDBG 技巧:列出模块(DLL/EXE)里面所有的符号(symbol)
  15. 手机连接Eclipse连接不上
  16. 特殊总账标识 备选统驭科目应用详解
  17. 循环神经网络中的LSTM和GRU
  18. ubuntu16.04解决耳机没有声音
  19. 【GAMES201学习笔记】MLS-MPM公式基础
  20. 算法_数学问题_Question8_猜牌术(java实现)

热门文章

  1. 安装kali之后那些事儿
  2. 625某电商网站数据库宕机故障解决实录(上)
  3. linux以下C 利用openssl的AES库加密,解密
  4. 谈谈Linux下动态库查找路径的问题
  5. linux查询rpm包详细信息
  6. 3802.消灭数组-AcWing题库
  7. 参数模型 非参数模型 生成模型 判别模型
  8. centos mysql 主从安装_基于 CentOS Mysql 安装与主从同步配置详解
  9. html css字体最小,html-字体大小CSS问题
  10. java hashmap value值_如何在Java中的HashMap中打印键的所有值