HDU6200 mustedge mustedge mustedge
建dfs树之后,在dfs树上加边其实就是让dfs树上一些边没有用了。(就这一点我想了很久才想到,真是zz啊)
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int maxn=1e5+10;
int T,n,m,Q; int aa,ff;char cc;
int read() {
aa=0;cc=getchar();ff=1;
while(cc<'0'||cc>'9') {
if(cc=='-') ff=-1;
cc=getchar();
}
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa*ff;
} struct Edge{
int u,v;
}; vector<Edge> G; int fir[maxn],nxt[2*maxn],to[2*maxn],e=0;
void add(int x,int y) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;
to[++e]=x;nxt[e]=fir[y];fir[y]=e;
} int f[maxn];
int find(int x) {return x==f[x]? x:f[x]=find(f[x]);} int fa[maxn],size[maxn],son[maxn],dep[maxn];
void dfs1(int pos) {
size[pos]=1;int y,z;
for(y=fir[pos];y;y=nxt[y]) {
if((z=to[y])==fa[pos]) continue;
fa[z]=pos;dep[z]=dep[pos]+1;
dfs1(z);
size[pos]+=size[z];
if(size[z]>size[son[pos]]) son[pos]=z;
}
} int id[maxn],top[maxn],cnt;
void dfs2(int pos,int tp) {
id[pos]=++cnt; top[pos]=tp;
if(!son[pos]) return;
dfs2(son[pos],tp);
int y,z;
for(y=fir[pos];y;y=nxt[y]) {
if((z=to[y])==fa[pos]||to[y]==son[pos]) continue;
dfs2(z,z);
}
} int sz[maxn]; int q(int l,int r) {
int rs=0;l--;
while(r) { rs+=sz[r]; r-=(r&-r); }
while(l) { rs-=sz[l]; l-=(l&-l); }
return rs;
} void chge(int l,int r){
int rr;
for(r=find(r);r>=l;r=f[r]) {
rr=r;
while(rr<=n){ sz[rr]--; rr+=(rr&-rr); }
f[r]=find(r-1);
}
} void get_lca(int x,int y,int p) {
int rs=0;
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
if(p) rs+=q(id[top[x]],id[x]);
else chge(id[top[x]],id[x]);
x=fa[top[x]];
}
if(x!=y) {
if(dep[x]<dep[y]) swap(x,y);
if(p) rs+=q(id[y]+1,id[x]);
else chge(id[y]+1,id[x]);
}
if(p) printf("%d\n",rs);
} int main() {
T=read();
int x,y,z,xx,yy;
for(int qaq=1;qaq<=T;++qaq) {
n=read();m=read(); G.clear(); e=0; cnt=0;
memset(fir,0,sizeof(fir));
memset(son,0,sizeof(son));
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=m;++i) {
x=read();y=read();
xx=find(x);yy=find(y);
if(xx!=yy) add(x,y),f[xx]=yy;
else G.push_back(Edge{x,y});
}
Q=read(); dep[1]=1;
dfs1(1); dfs2(1,1);
for(int i=1;i<=n;++i) f[i]=i;
for(int i=1;i<=n;++i) sz[i]=(i&-i);
z=G.size();
for(int i=0;i<z;++i) get_lca(G[i].u,G[i].v,0);
printf("Case #%d:\n",qaq);
for(int i=1;i<=Q;++i) {
x=read();y=read();z=read();
get_lca(y,z,x-1);
}
}
return 0;
}
除此之外,也可以用树状数组维护每个点到根的距离,然后每次修改就是把子树的区间-1,这样就是区间修改单点查询了。
不过还是要用并查集维护每条边上方第一个没有清零的边(有用的边)。
所以说这道题的重点就是避免重复的修改浪费时间,用并查集维护上方第一个没有清零的边。
HDU6200 mustedge mustedge mustedge的更多相关文章
- hdu6200 mustedge mustedge mustedge (并查集+dfs序树状数组)
题意 给定一个n个点m条边无向图(n,m<=1e5) 支持两个操作 1.添加一条边 2.询问点u到点v的所有路径中必经边的条数 操作数<=1e5 分析 第一眼看起来像是要动态维护无向图的边 ...
- hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点)
hdu 6200 mustedge mustedge(并查集+树状数组 或者 LCT 缩点) 题意: 给一张无向连通图,有两种操作 1 u v 加一条边(u,v) 2 u v 计算u到v路径上桥的个数 ...
- 【一坨理论AC的题】Orz sxy大佬
1.UVA10891 Game of Sum 2.LA4254 Processor . 3.UVA10905 Children's Game 4.UVA11389 The Bus Driver Pro ...
随机推荐
- sed 批量替换文件
1.想把某个目录下包含only-upstage的文件都替换成onlyu-base sed -i -e 's/onlyu-upstage/onlyu-base/g' ` grep -rl onlyu ...
- 【分块】P4135 作诗
分块太暴力惹... 没做出来.看了题解qaq 分析: 两头$\sqrt{n}$暴力维护 预处理ans[i][j],sum[i][j] sum[i][j]是一个前缀和,前i块值为j的数量 ans[i][ ...
- 内核下枚举进程 (二)ZwQuerySystemInformation
说明: SYSTEM_INFORMATION_CLASS 的5号功能枚举进程信息.其是这个函数对应着ring3下的 NtQuerySystemInformation,但msdn上说win8以后ZwQu ...
- 用shell编写小九九乘法表程序
1.使用for循环 运行结果: 2.方法二:for循环 运行结果: 备注: 1. echo -n 的意思是不自动换行,因为在linux shell中 echo到最后一个字符时会自动换行的,所以echo ...
- 廖雪峰Java13网络编程-3其他-1HTTP编程
1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...
- 创建vue项目及引入插件
部署开发环境 安装淘宝镜像 npm install -g cnpm --registry=https://registry.npm.taobao.org 安装webpack cnpm install ...
- 开发函数计算的正确姿势 —— 使用 ROS 进行资源编排
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...
- js 类数组转化数组
一.常见类数组集合 (1).arguements function fn(){ var arr = [].slice.call(arguements,0); } (2).HTMLCollection ...
- IOS6 新特性之UIActivityViewController详解
新的IOS6增加了一些新特性.因为应用需要,所以在国庆的几天里.研究了一下IOS6的说明文档,然后大概地总结了一下UIActivityViewController的用法与大家分享. 首先 从实际效果入 ...
- 北京服务业占GDP比重达81.7%
北京服务业占GDP比重达81.7% 2017-05-17 19:46:00 来源: 中国新闻网(北京)举报 0 易信 微信 QQ空间 微博 更多 (原标题:北京服务业占GDP比重达81.7%) ...