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)
我写这篇博客的原因 证明我也是学过圆方树的 顺便存存代码 前置技能 双联通分量:点双 然后就没辣 圆方树 建立 新建一个图 定义原图中的所有点为圆点 对于每个点双联通分量(只有两个点的也算) 建立一个 ...
随机推荐
- JWT知识整理
JSON Web Token:(https://jwt.io/) JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-co ...
- MySQL 索引最佳实践
原文请关注 这里 这是 文章 的翻译,在翻译过程中,会对其中涉及到的语句加上一些个人理解以及 SQL 语句的执行,并进行特别的标注. 1. 你做了一个很棒的选择,因为: 对于普通开发者和 DBA,理解 ...
- Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
1. 利用for循环遍历整个列表 magicians = ['alice', 'dsvid', 'carolina'] # 遍历整个列表 for magician in magicians: prin ...
- WUSTOJ 1333: Sequential game(Java)
题目链接:1333: Sequential game Description Sequential detector is a very important device in Hardware ex ...
- java 简单操作HDFS
创建java 项目 package com.yw.hadoop273; import org.apache.hadoop.conf.Configuration; import org.apache.h ...
- 【flume】5.采集日志进入hbase
设置我们的flume配置信息 # Licensed to the Apache Software Foundation (ASF) under one # or more contributor li ...
- Linux磁盘管理系列 — 磁盘配额管理
一.磁盘管理的概念 Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限.因此,系统管 ...
- SOS dp
设$ans=\sum\limits_{A \cap B=\varnothing} f(A)g(B) $ 直接暴力枚举子集是$O(3^n)$, 一个技巧是先预处理出$h(S)=\sum\limits_{ ...
- Nginx 配置反向代理ip
参考文档: https://blog.csdn.net/stevenprime/article/details/7918094
- 张量(tensor)的广播
在使用numpy 对张量(数组)进行操作时,两个形状相同的张量进行加减等运算很容易理解,那么不同形状的张量之间的运算是通过广播来实现的.广播实际上很简单,但是弄清楚是也花了不小功夫,这里记录一下. 广 ...