首先%%%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. [JZOJ4639] 【NOIP2016提高组A组7.16】Angel Beats!

    题目 描述 题目大意 给你一棵树,每次询问两个点,求出这两个点的子树的重心到其中每个点的距离和. 重心的定义是到其中每个点距离和最小的点(不一定在两棵子树内) 思考历程 想想以前我是怎么求重心的呢-- ...

  2. csp-s模拟测试61砖块, 数字,甜圈题解

    题面:https://www.cnblogs.com/Juve/articles/11626350.html 砖块: 直接模拟即可,map统计被覆盖的次数 #include<iostream&g ...

  3. windows环境下,svn未备份情况下重新恢复

    公司有个同事在未打招呼的情况下把公司服务器进行重新装系统,崩溃啊.SVN之前未备份,还好SVN的库(Repositories)还在,如下图: 恢复办法如下: 由于之前安装的就是VisualSVN-Se ...

  4. 使用Native API 创建进程

    使用 Native API 创建进程 最近几个星期一直在研究这个题目.因为关于方面的资料比较多(可以看下面的参考文章),所以开始时以为很快就结束了.谁知道真正动起手来才发现有很多要考虑的地方,不过还好 ...

  5. JeePlus-Note:笔记1

    ylbtech-JeePlus-Note:笔记1 1.返回顶部 1. 1.JeePlus/代码生成器http://localhost:8081/a/login 2.manager/Java基础框架ht ...

  6. Java-MyBatis-MyBatis3-XML映射文件:结果映射

    ylbtech-Java-MyBatis-MyBatis3-XML映射文件:结果映射 1.返回顶部 1. 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素.它可以让你从 90 ...

  7. java主函数参数传递args

    a.javaJava应用程序的主入口方法main(String[] args),表示该方法需要接收一个字符串数组类型的参数, 如果该参数不指定,agrs接收的是null. 程序:   public C ...

  8. pycharm使用教程链接+部分练习题01

    pycharm安装: https://www.cnblogs.com/jin-xin/articles/9811379.html pycharm使用教程: https://edu.51cto.com/ ...

  9. <scrapy爬虫>爬取猫眼电影top100详细信息

    1.创建scrapy项目 dos窗口输入: scrapy startproject maoyan cd maoyan 2.编写item.py文件(相当于编写模板,需要爬取的数据在这里定义) # -*- ...

  10. 基于baseline和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.1 部分内容(其余部分会陆续补充上来). koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文 ...