「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\) 中找到合适的 ...
随机推荐
- 单体内置对象——Global对象
单体内置对象的定义:由ECMAScript实现提供的.不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前已经存在了.意思就是说:开发人员不必显式地实例化内置对象,因为他们已经实例化了. ...
- eval()方法与str()方法
eval()方法与str()方法 #_author:Administrator#date:2019/10/31 a={ 'q':{'xxx':3456}}#将一个字典转换成一个字符串a=str(a)p ...
- Windows相关命令
1.查看端口8080被哪个进程占用 netstat -ano | findstr "8080" 2.查看进程号为5768对应的进程 tasklist | findstr " ...
- 01.visual studio 2017添加菜单
创建项目 文件--新建项目 如果新建项目 左侧没有扩展菜单,请安装即可 添加菜单 右键--添加新项 菜单设置 菜单设置文件: MyCommandPackage.vsct <Buttons> ...
- Android之AbsoluteLayout(绝对布局)
1.属性简介 为了适配不同机型,绝对布局使用很少! android:layout_x="50dp" android:layout_y="100dp"也只有在Ab ...
- iOS之CATextLayer属性简介
1.CATextLayer简介 CATextLayer快速高效简单地来渲染纯文本.NSAttributedString /* The text layer provides simple text l ...
- Freemaker 开发学习笔记
Freemaker 是一个强大的模板引擎,相比 velocity 而言,其强大的过程调用.递归和闭包回调功能让 freemaker 可以完成几乎所有我们所想的功能.从个人看法而言,freemaker ...
- OpenCASCADE动画功能2
OpenCASCADE动画功能2 eryar@163.com OpenCASCADE是一个开发平台,主要提供三维曲面和实体建模.CAD数据交换及可视化等功能.OCCT最适用于开发三维建模CAD软件.加 ...
- 利用jQuery获取jsonp
前端js代码: $.ajax({ url: 'http://localhost:8080/webApp/somejsonp', dataType: "jsonp", jsonp: ...
- elasticsearch 中文API bulk(六)
bulk API bulk API允许开发者在一个请求中索引和删除多个文档.下面是使用实例. import static org.elasticsearch.common.xcontent.XCont ...