首先%%%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的更多相关文章

  1. 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie

    题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1​​≤r​1​​<l​2​​≤r​2​​≤N,x⨁yx\bigoplus yx⨁y 表示 ...

  2. LOJ#10117. 「一本通 4.1 练习 2」简单题

    LOJ#10117. 「一本通 4.1 练习 2」简单题 题目描述 题目来源:$CQOI 2006$ 有一个$n$个元素的数组,每个元素初始均为$0$.有$m$条指令,要么让其中一段连续序列数字反转— ...

  3. LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

    LOJ#10064. 「一本通 3.1 例 1」黑暗城堡 题目描述 你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度. 城堡是树形的并且满足下面的条件: 设$D_i$为如果 ...

  4. 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie

    #10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...

  5. 「LOJ#10042」「一本通 2.1 练习 8」收集雪花 (map

    题目描述 不同的雪花往往有不同的形状.在北方的同学想将雪花收集起来,作为礼物送给在南方的同学们.一共有 n 个时刻,给出每个时刻下落雪花的形状,用不同的整数表示不同的形状.在收集的过程中,同学们不希望 ...

  6. 「LOJ#10043」「一本通 2.2 例 1」剪花布条 (KMP

    题目描述 原题来自:HDU 2087 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入格式 输入数据 ...

  7. 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离,如图所示:两个点 a .b 连通,记作 e(a,b),当且仅当 a .b的扩散区域有公共部分.连通块的定义是块内的任意两个点 u.v ...

  8. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

  9. #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ

    题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...

  10. 「一本通 1.3 例 5」weight]

    「一本通 1.3 例 5」weight 题面 给定原数列 \(a_1,a_2,a_n\) ,给定每个数的前缀和以及后缀和,并且打乱顺序. 给出一个集合 \(S\) 要求从集合 \(S\) 中找到合适的 ...

随机推荐

  1. spring:ApplicationContext的三个实现类

    * ApplicationContest的三个常用实现类* ClassPathXmlApplicationContext:它可以加载类路径的配置文件,要求配置文件必须在类路径下,如果不在则加载不了* ...

  2. python库参考学习网址

    https://github.com/china-testing/python-api-tesing 这里有很多python库参考

  3. input 数值验证

    1.手动校验数字为整数 Number.isInteger <el-input class="radioInput" v-model.number="ruleForm ...

  4. 关于公式文件.eqn

    建议默认打开该选项

  5. alias用于设置当前数据表的别名,

    alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等. 示例: $Model = M('User'); $Model->alias('a')->join('__DE ...

  6. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  7. Joomla - 部署(线上部署)

    一.线上部署 线上部署可以理解为把本地网站迁移到线上,使用 akeeba backup 进行备份和迁移即可 参考 Joomla - akeeba backup(joomla网站备份.迁移扩展)的第三. ...

  8. 模板——tarjan求割点

    在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合. 注意求割点中的low定义: 割点中low[u]记录节点u或u的子树 ...

  9. Ajax请求Session超时解决

    web前端js代码: $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", ...

  10. 我认为最节省时间的CSS命名规范

    CSS命名规范一 js中对变量的命名最好使用camel case驼峰式命名法,但CSS中更适用于red-box命名规范. CSS命名规范二 BEM命名规范 B=>block E=>elem ...