「LOJ10104」「一本通 3.6 练习 5」Blockade-Tarjan
首先%%%lydrainbowcat
这个题唔,真是Tarjan好题(?)
不知道为啥也叫BLO,首字母?
<题面>
搜索树真真的棒!
仔细看看,知道是Tarjan了,切掉一个点有不通的对数,明显求割点。
$\langle i,j \rangle$和$\langle j,i\rangle$是不一样的
一边统计搜索树上的$size$
然后在割点的出边统计
下面是重点:
首先定义$sum_i$为子树$i$上的$size$总和,$pre_i$为$i$的父亲节点,$pn$为总点数
如果
1.搜到了儿子
1)$low_s<low_i(s \in son_i)$绝对儿子,直接加
用$size_s \times (pn-size_s)$统计对答案贡献(思考思考)
2)$low_s=low_i(s \in son_i)$考虑一下
必须在搜索树上$pre$为$i$才能统计
不然不加重就是数据炸了(事实证明数据不是很水)
2.是父亲
先跳过,等会统计完$sum_i$自然可求
统计完了,把$(pn-sum_i-1)*sum_i$加进去,发现少点什么,
把$pn-1$加进去,即为$i$号点的出对$\langle i,n\rangle(n \neq i)$
快乐水果~
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#define N 111111
#define M 505505
#define LL long long
using namespace std;
struct SR {
int f, next, t;
} rs[M * ];
int fl[N], cnt = ;
int pn, edn;
inline int Max(const int a, const int b) {
if (a > b)
return a;
return b;
}
inline int Min(const int a, const int b) {
if (a < b)
return a;
return b;
}
void add(int f, int t) {
rs[cnt].f = f, rs[cnt].t = t, rs[cnt].next = fl[f];
fl[f] = cnt;
cnt++;
}
int dfn[N], low[N], dep = , siz[N], pres[N];
bool is_totop[N], is_v[N], is_cut[N];
LL ans[N], ros = ;
void tarjan(int k, int pre) {
dep++;
siz[k] = ;
dfn[k] = low[k] = dep;
pres[k] = pre;
for (int i = fl[k]; i != -; i = rs[i].next) {
int t = rs[i].t;
if (!dfn[t]) {
tarjan(t, k);
low[k] = Min(low[k], low[t]);
siz[k] += siz[t];
if (k == )
ros++;
if (low[t] >= dfn[k])
is_cut[k] = ;
} else {
if (low[k] > dfn[t] && t != pre) {
low[k] = dfn[t];
}
}
}
}
LL calc(int k) { // cout<<"Cut"<<k<<endl;
LL aan = , sum = ;
for (int i = fl[k]; i != -; i = rs[i].next) {
int t = rs[i].t;
if (low[t] > dfn[k]) {
aan += (LL)siz[t] * (pn - siz[t]);
sum += siz[t];
} else if (low[t] == dfn[k] && pres[t] == k) {
aan += (LL)siz[t] * (pn - siz[t]);
sum += siz[t];
}
}
return aan + pn - + (LL)((LL)pn - - sum) * ( + (LL)sum);
}
int main() {
int a, b;
memset(fl, -, sizeof fl);
scanf("%d%d", &pn, &edn);
for (int i = ; i <= edn; i++) {
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
tarjan(, );
if (ros <= )
ans[] = (LL)(pn - ) * ;
else
ans[] = calc();
for (int i = ; i <= pn; i++) {
if (is_cut[i]) {
ans[i] = calc(i);
} else {
ans[i] = (LL)(pn - ) * ;
}
}
for (int i = ; i <= pn; i++) {
printf("%lld\n", ans[i]);
}
return ;
}
「LOJ10104」「一本通 3.6 练习 5」Blockade-Tarjan的更多相关文章
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- LOJ#10117. 「一本通 4.1 练习 2」简单题
LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...
- LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...
- 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
#10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...
- 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map
题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...
- 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP
题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...
- 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集
题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
- 「一本通 1.3 例 5」weight]
「一本通 1.3 例 5」weight 题面 给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序. 给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的 ...
随机推荐
- spring:ApplicationContext的三个实现类
* ApplicationContest的三个常用实现类* ClassPathXmlApplicationContext:它可以加载类路径的配置文件,要求配置文件必须在类路径下,如果不在则加载不了* ...
- python库参考学习网址
https://github.com/china-testing/python-api-tesing 这里有很多python库参考
- input 数值验证
1.手动校验数字为整数 Number.isInteger <el-input class="radioInput" v-model.number="ruleForm ...
- 关于公式文件.eqn
建议默认打开该选项
- alias用于设置当前数据表的别名,
alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等. 示例: $Model = M('User'); $Model->alias('a')->join('__DE ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- Joomla - 部署(线上部署)
一.线上部署 线上部署可以理解为把本地网站迁移到线上,使用 akeeba backup 进行备份和迁移即可 参考 Joomla - akeeba backup(joomla网站备份.迁移扩展)的第三. ...
- 模板——tarjan求割点
在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合. 注意求割点中的low定义: 割点中low[u]记录节点u或u的子树 ...
- Ajax请求Session超时解决
web前端js代码: $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", ...
- 我认为最节省时间的CSS命名规范
CSS命名规范一 js中对变量的命名最好使用camel case驼峰式命名法,但CSS中更适用于red-box命名规范. CSS命名规范二 BEM命名规范 B=>block E=>elem ...