首先%%%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. Mysql 数据库crash恢复

    之前搭建的ghost博客比较坑,修改comment之后重启数据丢了,对node不熟悉,所以就切换回到wordpress了. 回滚快照之后发现数据库crash了,提示如下信息 2016-06-15 23 ...

  2. scoreboarding

    Reference docs: https://en.wikipedia.org/wiki/Scoreboarding SSC_course_5_Scoreboard_ex.pdf 1, what i ...

  3. PAT甲级——A1002 A+B for Polynomials

    This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...

  4. Python实例1-Collatz 序列

    编写一个名为 collatz()的函数,它有一个名为 number 的参数.如果参数是偶数,那么 collatz()就打印出 number // 2, 并返回该值.如果 number 是奇数, col ...

  5. Redis学习笔记01-分布式锁

    1.分布式锁的定义与理解 在并发任务中,当对数据执行修改和删除时为了防止多个任务同时拿到数据而产生的混乱,这时就要用到分布式锁来限制程序的并发执行. Redis分布式锁本质上要实现的目标就是在Redi ...

  6. python 中的 is 方法 总结

    isidentifier: 判断变量名是否合法 iskeyword:是否为内置关键字

  7. TKmybatis的框架介绍及使用方法

    最近项目使用了SpringBoot+TKMytis框架,期间遇到一些问题,顺便记一下. 一.框架配置 配置的话非常简单,我用的是SpringBoot,直接引入: <dependency> ...

  8. 修改linux命令行的提示符PS1

    # If not running interactively, don't do anything [ -z "$PS1" ] && return # check ...

  9. Odoo文档管理/知识管理应用实践 - 上传附件

    测试环境: Odoo8.0 Odoo中的文档管理/知识管理可用于保存采购.销售.生产等一系列业务流程中产生的文件.凭证,可关联到具体的每一笔业务操作:也能用于管理公司的合同.资料,创建知识库以分享内部 ...

  10. 洛谷P3747 [六省联考2017]相逢是问候

    传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...