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

难道是静态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)]);
}
}

  

HDU 6074 - Phone Call | 2017 Multi-University Training Contest 4的更多相关文章

  1. HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

    /* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问 ...

  2. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)

    OO's Sequence                                                          Time Limit: 4000/2000 MS (Jav ...

  4. hdu 5416 CRB and Tree(2015 Multi-University Training Contest 10)

    CRB and Tree                                                             Time Limit: 8000/4000 MS (J ...

  5. HDU 4944 FSF’s game(2014 Multi-University Training Contest 7)

    思路:  ans[n]=  ans[n-1] + { (n,1),(n,2).....(n,n)}  现在任务 是 计算  { (n,1),(n,2).....(n,n)}(k=n的任意因子) 很明显 ...

  6. HDU 4940 Destroy Transportation system(2014 Multi-University Training Contest 7)

    思路:无源汇有上下界可行流判定, 原来每条边转化成  下界为D  上界为 D+B   ,判断是否存在可行流即可. 为什么呢?  如果存在可行流  那么说明对于任意的 S 集合流出的肯定等于 流入的, ...

  7. HDU 4627 The Unsolvable Problem 2013 Multi-University Training Contest 3

    给你一个数 n ( 2 <= n <= 109 ),现在需要你找到一对数a, b (a + b = n),并且使得LCM(a, b)尽可能的大,然后输出最大的 LCM(a, b). (为什 ...

  8. HDU 4869 Turn the pokers (2014 Multi-University Training Contest 1)

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. hdu 6315 Naive Operations (2018 Multi-University Training Contest 2 1007)

    Naive Operations Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 502768/502768 K (Java/Other ...

随机推荐

  1. No package 'eventlog' found

    syslog-ng のインスト�ル手� ●ダウンロ�ドサイト http://www.balabit.com/downloads/files/syslog-ng/sources/stable/src/ ...

  2. Linux Crontab格式说明

    Crontab基本格式: * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4 ...

  3. VMWare虚拟机15.X局域网网络配置(修改网卡)

    最近在搞几台虚拟机来学习分布式和大数据的相关技术,首先先要把虚拟机搞起来,搞起虚拟机第一步先安装系统,接着配置网络 vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式).N ...

  4. 【转载】MyBatis批量插入数据(insert)

    介绍:MyBatis批量插入数据,原理就是在xml文件中添加 foreach 语句,然后MyBatis自动在values后面添加多个括号: XML文件如下: <?xml version=&quo ...

  5. 使用rsync工具构建php项目管理平台

    对于phper来说部署项目和更新项目是很方便的,只要直接将写好的项目覆盖到项目的根目录就可以啦.但是平时项目开发的时候肯定不是只部署一个环境,一般是三套环境(开发环境.测试环境.生产环境),我们每次在 ...

  6. python学习-1 编程语言的介绍

    1.开发语言: 高级语言:Java.python.C#.PHP.Go.ruby.C++等等 低级语言:C.汇编语言 2.机器码和字节码 高级语言 ====>字节码 低级语言===>机器码 ...

  7. 【AC自动机】文本生成器

    [题目链接] https://loj.ac/problem/10063 [题意] 给出长度为m,n个模式串,请问只要长度为m的串中有一个模式串就算是可读. [分析] 其实如果直接分析全部可读的情况,一 ...

  8. Linux Centos7 离线安装docker 【官网翻译和注释】

    Centos7的Docker安装 需要一个维护版本的centos7,所以6不行. 卸载旧版本 旧版本的docker被称为 docker or docker-engine 如果存在请删除它们. sudo ...

  9. MQTT协议探究(三)

    1 回顾与本次目标 1.1 回顾 主题通配符 主题语义和用法 WireShark进行抓包分析了报文 报文分析: SUBSCRIBE--订阅主题 SUBACK--订阅确认 UNNSUBSCRIBE--取 ...

  10. 三调数据库标注插件v1.3

    三调数据库标注插件 插件介绍: 本插件基于VS2010+ARCGIS Addin 开发,高效率处理三调数据,可以标注相关属性.检查尖角.检查节点平均密度.检查地类图斑属性一致性,方便数据导入建库软件之 ...