BZOJ3331 压力 (圆方树+树上差分)
题意
略
题解
求路径上的割点。
然后就直接圆方树上差分
CODE
#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; for(;!isdigit(ch=getchar()););
for(x=ch-'0';isdigit(ch=getchar());)x=x*10+ch-'0';
}
const int MAXN = 100005;
const int MAXM = 200005;
int n, m, q;
int fir[MAXN], to[MAXM<<1], nxt[MAXM<<1], cnt = 1;
inline void link(int u, int v) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt;
to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt;
}
int dfn[MAXN], low[MAXN], tmr, stk[MAXN], top, tot;
vector<int>G[MAXN<<1];
void tarjan(int u, int ff) {
stk[++top] = u;
low[u] = dfn[u] = ++tmr;
for(int i = fir[u], v; i; i = nxt[i])
if((i^1) != ff) {
if(!dfn[v=to[i]]) {
tarjan(v, i);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u]) {
++tot;
do G[tot].push_back(stk[top]), G[stk[top]].push_back(tot);
while(stk[top--] != v);
G[tot].push_back(u), G[u].push_back(tot);
}
}
else low[u] = min(low[u], dfn[v]);
}
}
int dep[MAXN<<1], sz[MAXN<<1], tp[MAXN<<1], son[MAXN<<1], fa[MAXN<<1];
void dfs1(int u, int ff) {
dep[u] = dep[fa[u]=ff] + (sz[u] = 1);
for(int i = G[u].size()-1, v; i >= 0; --i)
if((v=G[u][i]) != ff) {
dfs1(v, u), sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
}
void dfs2(int u, int Tp) {
tp[u] = Tp;
if(son[u]) dfs2(son[u], Tp);
for(int i = G[u].size()-1, v; i >= 0; --i)
if((v=G[u][i]) != fa[u] && v != son[u])
dfs2(v, v);
}
inline int lca(int u, int v) {
while(tp[u] != tp[v]) {
if(dep[tp[u]] > dep[tp[v]]) u = fa[tp[u]];
else v = fa[tp[v]];
}
return dep[u] < dep[v] ? u : v;
}
int f[MAXN<<1];
bool vis[MAXN<<1];
int dfs(int u) {
if(vis[u]) return f[u]; vis[u] = 1;
for(int i = G[u].size()-1, v; i >= 0; --i)
if((v=G[u][i]) != fa[u])
f[u] += dfs(v);
return f[u];
}
int main() {
rd(n), rd(m), rd(q); tot = n;
for(int i = 1, u, v; i <= m; ++i) rd(u), rd(v), link(u, v);
for(int i = 1; i <= n; ++i) if(!dfn[i]) tarjan(i, 0), --top;
dfs1(1, 0), dfs2(1, 1);
for(int i = 1, u, v, Lca; i <= q; ++i) {
rd(u), rd(v);
Lca = lca(u, v);
++f[u], ++f[v], --f[Lca], --f[fa[Lca]];
}
for(int i = 1; i <= n; ++i) printf("%d\n", dfs(i));
}
附上圆方树学习链接:
租酥雨的博客
YoungNeal的博客
BZOJ3331 压力 (圆方树+树上差分)的更多相关文章
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
- bzoj3331 压力(圆方树)
题目链接 圆方树 圆方树就是对于联通无向图中的每一个点双新建一个方点,与点双中的每个点连一条边,然后将原来的边删去.将原来的点看作圆点,新建的点看作方点.所以叫做圆方树. 性质 1.圆方树肯定是棵树( ...
- 【题解】Uoj#30 Tourist(广义圆方树+树上全家桶)
[题解]Uoj#30 Tourist(广义圆方树+树上全家桶) 名字听起来很霸气其实算法很简单.... 仙人掌上的普通圆方树是普及题,但是广义圆方树虽然很直观但是有很多地方值得深思 说一下算法的流程: ...
- BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...
- Codechef Sad Pairs——圆方树+虚树+树上差分
SADPAIRS 删点不连通,点双,圆方树 非割点:没有影响 割点:子树DP一下 有不同颜色,所以建立虚树 在圆方树上dfs时候 如果当前点是割点 1.统计当前颜色虚树上的不连通点对,树形DP即可 2 ...
- 仙人掌 && 圆方树 && 虚树 总结
仙人掌 && 圆方树 && 虚树 总结 Part1 仙人掌 定义 仙人掌是满足以下两个限制的图: 图完全联通. 不存在一条边处在两个环中. 其中第二个限制让仙人掌的题做 ...
- Note -「圆方树」学习笔记
目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...
- 仙人掌&圆方树
仙人掌&圆方树 Tags:图论 [x] [luogu4320]道路相遇 https://www.luogu.org/problemnew/show/P4320 [ ] [SDOI2018]战略 ...
- 圆方树简介(UOJ30:CF Round #278 Tourists)
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...
随机推荐
- 十分钟快速入门 Python,看完即会,不用收藏!
本文以 Eric Matthes 的<Python编程:从入门到实践>为基础,以有一定其他语言经验的程序员视角,对书中内容提炼总结,化繁为简,将这本书的精髓融合成一篇10分钟能读完的文章. ...
- NOIP2017[提高组] 宝藏 题解
解析 我们观察范围可以发现n非常的小,(一般来说不是搜索就是状压dp)所以说对于这题我们可以用记忆化搜索或者dp,我们发现起点不同那么最终答案也就不同,也就是说答案是跟起点有关的,于是我们便可以想到去 ...
- deepin linux 打开ssh服务
首先,更新一下软件源,打开"终端窗口",输入"sudo apt-get update"-->回车-->" 输入当前登录用户的管理员密码&q ...
- 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写
一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...
- 括号匹配问题 —— Deque双端队列解法
题目: 给定一个只包括 '(',')','{','}','[',']'?的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可 ...
- Tomcat一闪而过的调试方法
很少用tomcat来部署,都是用springboot微服务.只是以前学的时候搞demo试过而已. 软件测试的期末作业要求要测一个Javaweb的项目,给了一个包然后要求部署在tomcat中并启动. 然 ...
- .ajaxStart() / .ajaxStop() —— ajax请求开始时 / 结束时触发
一..ajaxStart()——ajax请求开始时触发 描述:ajax请求开始时触发 .ajaxStart()的回调函数,全局的,所有的ajax都可以用 写法:元素.ajaxStart(functi ...
- OOM与StackOverFlow发生的原因及解决办法【待完成】
1,Out Of Memery 内存耗尽 1,1 产生原因 1.1.1 内存用完[堆内存] package com.cnblogs.mufasa; import org.junit.Test; imp ...
- 使用docker搭建reids主从,哨兵。
Redis主从配置,如果没有真机就要用虚拟机,使用Docke for Windows host网络有问题. 准备: 1.安装虚拟机. 2.下载redis的安装文件:http://download.re ...
- vue实现组件切换的两种方式
<!DOCTYPE html> <html> <head> <title>组件的切换</title> <meta charset=&q ...