hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)

题意:

给一张无向连通图,有两种操作

1 u v 加一条边(u,v)

2 u v 计算u到v路径上桥的个数

思路:

对于一颗树来说,其实就是统计u到v路径上白边的个数,

加边就是将u到v的路径上所有边都染黑,查询就是查询路径上白边的个数

由于树上每条边最多只会被修改一次,所以可以并查集暴力修改,每个点u指向祖先结点第一条白边的位置。

涂黑白边的操作对应点的子树的答案减一,可以用dfs序树状数组维护

所以u到v路径上黑边的个数就是u,v,减去lca的两倍


#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int> using namespace std;
const int N = 1e5 + 10; void read(int &x){
x = 0;
char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') x = x * 10 + c - '0',c = getchar();
}
int n,m,q,tot;
struct Edge{int v,nxt;};
Edge e[2 * N];
int head[N];
void add(int u,int v){
e[tot].v = v,e[tot].nxt = head[u],head[u] = tot++;
}
int pa[N];
int Find(int x){return x == pa[x]?x:pa[x] = Find(pa[x]);}
vector<P> res;
int f[N][20],dis[N];
int in[N],out[N],times;
void dfs(int u,int fa,int d){
pa[u] = u,in[u] = ++times;
dis[u] = d,f[u][0] = fa;
for(int i = 1;i <= 18;i++) f[u][i] = f[f[u][i-1]][i-1];
for(int i = head[u];~i;i = e[i].nxt) if(e[i].v != fa) dfs(e[i].v,u,d + 1);
out[u] = times;
}
int LCA(int u,int v){
if(dis[u] < dis[v]) swap(u,v);
int d = dis[u] - dis[v];
for(int i = 18;i >= 0 && u != v;i--) if(d & (1<<i)) u = f[u][i];
if(u == v) return u;
for(int i = 18;i >= 0;i--) if(f[u][i] != f[v][i]) u = f[u][i],v = f[v][i];
return f[u][0];
}
int tr[N],vis[N];
int lowbit(int x){return x&(-x);}
void up(int pos,int c){
for(;pos <= n;pos += lowbit(pos)) tr[pos] += c;
}
int getsum(int pos){
int ans = 0;
for(;pos;pos -= lowbit(pos)) ans += tr[pos];
return ans;
}
void update(int u,int lca){
if(dis[u] <= dis[lca]) return ;
if(!vis[u]) vis[u] = 1,up(in[u],-1),up(out[u]+1,1);
pa[u] = f[u][0];
update(Find(pa[u]),lca);
}
int getans(int u,int v,int lca){
return dis[u] + dis[v] - 2 * dis[lca] + getsum(in[u]) + getsum(in[v]) - 2 * getsum(in[lca]);
}
void init(int n){
times = tot = 0;
for(int i = 1;i <= n;i++){
tr[i] = 0,head[i] = -1,pa[i] = i,vis[i] = 0;
}
res.clear();
}
int main()
{
int T,cas = 1,u,v,op,lca,fu,fv;
cin>>T;
while(T--){
read(n),read(m);
init(n);
for(int i = 0;i < m;i++){
read(u),read(v);
fu = Find(u),fv = Find(v);
if(fu != fv) {add(u,v);add(v,u);pa[fu] = fv;}
else res.push_back(P(u,v));
}
dfs(1,0,0);
for(auto p:res){
u = p.first,v = p.second,lca = LCA(u,v);
update(u,lca),update(v,lca);
}
printf("Case #%d:\n",cas++);
read(q);
while(q--){
read(op),read(u),read(v);
lca = LCA(u,v);
if(op == 1) update(Find(u),lca),update(Find(v),lca);
else printf("%d\n",getans(u,v,lca));
}
}
return 0;
}

hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)的更多相关文章

  1. Hdu 5458 Stability (LCA + 并查集 + 树状数组 + 缩点)

    题目链接: Hdu 5458 Stability 题目描述: 给出一个还有环和重边的图G,对图G有两种操作: 1 u v, 删除u与v之间的一天边 (保证这个边一定存在) 2 u v, 查询u到v的路 ...

  2. BZOJ-3211花神游历各国 并查集+树状数组

    一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...

  3. BZOJ3211 花神游历各国 并查集 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3211 题意概括 有n个数形成一个序列. m次操作. 有两种,分别是: 1. 区间开根(取整) 2. ...

  4. 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组

    题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...

  5. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  6. HDU 4750 Count The Pairs ★(图+并查集+树状数组)

    题意 给定一个无向图(N<=10000, E<=500000),定义f[s,t]表示从s到t经过的每条路径中最长的边的最小值.Q个询问,每个询问一个t,问有多少对(s, t)使得f[s, ...

  7. la4730(并查集+树状数组)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=30& ...

  8. 【BZOJ3211】花神游历各国 并查集+树状数组

    [BZOJ3211]花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 41 100 5 551 1 22 1 ...

  9. 【BZOJ4382】[POI2015]Podział naszyjnika 堆+并查集+树状数组

    [BZOJ4382][POI2015]Podział naszyjnika Description 长度为n的一串项链,每颗珠子是k种颜色之一. 第i颗与第i-1,i+1颗珠子相邻,第n颗与第1颗也相 ...

随机推荐

  1. MAthJax入门教程(五分钟上手)

    最近在研究,在页面中显示一些数学公式.搞得我很头疼. 据说MathJax会统一这已领域.所以去学了学.网上教程特别多.繁杂. 说的清楚的特别少. 我是这么跑通的,: 1.在官网下载代码地址为:http ...

  2. mongo数据库相关目录

    mongodb的docker化安装 mongodb的windows系统下安装 grafana使用Prometheus数据源监控mongo数据库 mongodb副本集的docker化安装 mongodb ...

  3. MySQL5.7版本安装

    安装方式一: ZIP压缩包安装 >>>首先,到MYSQL官网下载.zip格式的MySQL Server的压缩包,根据需要选择x86或x64版. >>>下载需要登录o ...

  4. you don't have permission to access forbidden

    前几天装一个phpStudy 集成环境,打开测试页面的时候突然出现如下错误: 有一些小总结. 一些小的开发测试在本地开发的话,直接localhost/file  就可以,  如果涉及到大的开发环境,一 ...

  5. 12.2.1 访问元素的样式【JavaScript高级程序设计第三版】

    任何支持style 特性的HTML 元素在JavaScript 中都有一个对应的style 属性.这个style 对象是CSSStyleDeclaration 的实例,包含着通过HTML 的style ...

  6. doc命令操作数据库(下)

    1.给数据表添加一组数据: 2.给数据表添加多组数据: 3.对数据进行删除和修改: 4.用select查询单个或多个数据信息: 5.去除重复值: 6.查询的各种用法: between的用法: 查询排序 ...

  7. Phpstrom开发工具

    下载地址 https://www.jetbrains.com/zh/phpstorm/specials/phpstorm/phpstorm.html?utm_source=baidu&utm_ ...

  8. JS基础知识-01

    01-浅谈前端发展史 第一阶段:C/S(client server)->B/S(browser server) 网页制作 技术栈:PhotoShop.HTML.CSS 第二阶段:从静态到动态,从 ...

  9. 一笔画问题 南阳acm42(貌似没用到什么算法)

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下 ...

  10. hdu6370 并查集+dfs

    Werewolf Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...