BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分
Solution
Tarjan 点双缩点, 加上树上差分计算。
注意特判。。。 我特判挂了好久呜呜呜
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define rd read()
using namespace std; const int N = 1e5 + ;
const int M = 2e5 + ;
const int base = ; int head[N], tot;
int Head[N << ], Tot;
int low[N], dfn[N], cnt, col, c[N], cut[N], n, m, Q;
int f[N << ][], nd, id[N], idf[N << ], dep[N << ];
int st[N], tp, num[N], sum[N << ]; vector<int> q[N << ]; struct edge {
int nxt, to;
}e[M << ], E[M << ]; int read() {
int X = , p = ; char c = getchar();
for (; c > '' || c < ''; c = getchar()) if (c == '-') p = -;
for (; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} void add(int u, int v) {
e[++tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
} void Add(int u, int v) {
E[++Tot].to = v;
E[Tot].nxt = Head[u];
Head[u] = Tot;
} void tarjan(int u) {
low[u] = dfn[u] = ++cnt;
st[++tp] = u;
int flag = ;
for (int i = head[u]; i; i = e[i].nxt) {
int nt = e[i].to;
if (!dfn[nt]) {
tarjan(nt);
low[u] = min(low[u], low[nt]);
if (low[nt] >= dfn[u]) {
flag++;
if (flag > || u - )
cut[u] = ;
col++;
for (; tp;) {
int v = st[tp--];
q[col].push_back(v);
if (v == nt)
break;
}
q[col].push_back(u);
}
}
else low[u] = min(low[u], dfn[nt]);
}
} void dfs(int u) {
for (int i = Head[u]; i; i = E[i].nxt) {
int nt = E[i].to;
if (f[u][] == nt)
continue;
f[nt][] = u;
dep[nt] = dep[u] + ;
dfs(nt);
}
} int LCA(int x, int y) {
if (dep[x] < dep[y])
swap(x, y);
for (int k = base - ; ~k; --k)
if (dep[f[x][k]] >= dep[y])
x = f[x][k];
if (x == y)
return x;
for (int k = base - ; ~k; --k)
if (f[x][k] != f[y][k])
x = f[x][k], y = f[y][k];
return f[x][];
} void dfs2(int u) {
for (int i = Head[u]; i; i = E[i].nxt) {
int nt = E[i].to;
if (nt == f[u][])
continue;
dfs2(nt);
sum[u] += sum[nt];
}
if(u > col)
num[idf[u]] += sum[u];
} int main()
{
//freopen("1.in","r", stdin);
//freopen("out.out","w",stdout);
n = rd; m = rd; Q = rd;
for (int i = ; i <= m; ++i) {
int u = rd, v = rd;
add(u, v); add(v, u);
}
tarjan();
nd = col;
for (int i = ; i <= n; ++i)
if (cut[i]) c[i] = ++nd, idf[nd] = i;
for (int i = ; i <= col; ++i)
for(int j = , len = q[i].size(); j < len; ++j) {
int x = q[i][j];
if (cut[x])
Add(i, c[x]), Add(c[x], i);
else c[x] = i;
}
dep[] = ;
dfs();
for (int k = ; k < base; ++k)
for (int i = ; i <= nd; ++i)
f[i][k] = f[f[i][k - ]][k - ];
for (; Q; Q--) {
int u = rd, v = rd, lca;
if (c[u] <= col) num[u]++;
if (c[v] <= col) num[v]++;
u = c[u]; v = c[v];
if (u == v) continue;
lca = LCA(u, v);
sum[v]++; sum[u]++;
sum[lca]--; sum[f[lca][]]--;
}
dfs2();
for (int i = ; i <= n; ++i)
printf("%d\n", num[i]);
}
BZOJ 3331 [BeiJing2013]压力-Tarjan + 树上差分的更多相关文章
- bzoj 3331: [BeiJing2013]压力
Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的 核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在巨大的压力 之下. 小强建立了一个模型.这 ...
- 3331: [BeiJing2013]压力
3331: [BeiJing2013]压力 LCA+树上差分,和之前类似的题差不多,就是多了个v-dcc缩点,唯一要注意的就是判断是否是割点,对于不是割点的点,如果他是起点或重点,ans++,和差分没 ...
- 【BZOJ3331】[BeiJing2013]压力 Tarjan求点双
[BZOJ3331][BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天 ...
- BZOJ 3307 雨天的尾巴 (树上差分+线段树合并)
题目大意:给你一棵树,树上一共n个节点,共m次操作,每次操作给一条链上的所有节点分配一个权值,求所有节点被分配到所有的权值里,出现次数最多的权值是多少,如果出现次数相同就输出最小的. (我辣鸡bzoj ...
- Solution -「BZOJ 3331」压力
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图,并给出 \(q\) 个点对 \((u,v)\),令 \(u\) 到 \ ...
- bzoj 2783: [JLOI2012]树【树上差分】
注意是等于s不是大于s dfs,用set或者map存这条链到root的点权和sum[u],更新答案的时候查一下有没有s-sum[u]即可 #include<iostream> #inclu ...
- BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树
题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...
- BZOJ 3331 (Tarjan缩点+树上差分)
题面 传送门 分析 用Tarjan求出割点,对点-双连通分量(v-DCC)进行缩点,图会变成一棵树 注意v-DCC的缩点和e-DCC不同,因为一个割点可能属于多个v-DCC 设图中共有p个割点和t个v ...
- BZOJ3331 [BeiJing2013]压力[圆方树+树上差分]
圆方树新技能get.具体笔记见图连通性问题学习笔记. 这题求无向图的必经点,这个是一个固定套路:首先,一张连通的无向图中,每对点双和点双之间是以一个且仅一个割点连接起来的(如果超过一个就不能是割点了) ...
随机推荐
- LisView控件
用LisView控件在窗体中创建一个表,设置一个按钮,点击按钮, 将数据库中的表在这个控件中显示(LisView控件中表格式列名与数据库中一致) 首先使用控件将表的每一列创建好,加入一个按钮,如图,现 ...
- 安装PostGIS 2.1.1 时遇到checking for library containing GDALAllRegister... no
在postgis中执行./configure时,遇到 checking for library containing GDALAllRegister... no 的错误信息 [root@test po ...
- opencv删除轮廓
#include <opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv ...
- 05_ssm基础(三)之Spring基础
11.spring入门引导 12.spring_HelloWord程序 实现步骤: 0.找到spring压缩包,并解压 1.拷贝jar包 2.添加主配置文件(官方文档约28页) 3.在测试中使用 13 ...
- CSS同时选择器
[CSS同时选择器] 同一个div拥有多个class时,我们可以作多个class作为组合来选择对象.方法就是将多个.className直接连接在一起(中间不能有空格). <p class=&qu ...
- Activity 与 Task
[Activity 与 Task] A task is a collection of activities that users interact with when performing a ce ...
- 抛弃WebService,在.NET4中用 jQuery 调用 WCF
在我们之前的开发中,对于ajax程序,都是通过jQuery调用标记为[System.Web.Script.Services.ScriptService]的WebService,然后在WebServic ...
- Nginx+Tomcat 实现动态分离,负载均衡
什么是动静分离 为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时 ...
- Shell特殊变量:$0 $# $* $@ $? $$和命令行参数
一.特殊变量表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数是$1,第二个参数是$2. $# 传递给脚本或函数的参数个数. $* ...
- php RSA加密传输代码示例(轉)
原文地址:http://www.cnblogs.com/firstForEver/p/5803940.html 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了. 服务端可 ...