[APIO2018] Duathlon 铁人两项

LG传送门

圆方树+简单DP。

不会圆方树的话可以看看我的另一篇文章

考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数。

看到题面中的一句话:

考虑到安全因素,选择的路径经过同一个点至多一次。

换句话说就是简单路径,用(广义)圆方树的基本条件已经满足,可以把问题变到树上:令方点的权值为所在点双的大小,圆点会被算重所以点权为\(-1\),统计任意两点间的点权和就好了。直接做是\(n ^ 2\)的,考虑枚举每一个点看会产生多少贡献,对答案的贡献就乘个点权。

注意图不一定联通。

#include <cstdio>
#include <cctype>
#include <vector>
#define R register
#define I inline
#define B 1000000
#define L long long
using namespace std;
const int N = 200003;
char buf[B], *p1, *p2;
I char gc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, B, stdin), p1 == p2) ? EOF : *p1++; }
I int rd() {
R int f = 0;
R char c = gc();
while (c < 48 || c > 57)
c = gc();
while (c > 47 && c < 58)
f = f * 10 + (c ^ 48), c = gc();
return f;
}
L ans = 0;
int s[N], w[N], dfn[N], low[N], vis[N], sta[N], siz[N], n, tim, cnt, stp, tot;
vector <int> g[N], G[N];
I int min(int x, int y) { return x < y ? x : y; }
void dfs(int x) {
dfn[x] = low[x] = ++tim, sta[++stp] = x, w[x] = -1, ++tot;
for (R int i = 0, y, z; i < s[x]; ++i)
if (!dfn[y = g[x][i]]){
dfs(y), low[x] = min(low[x], low[y]);
if (low[y] >= dfn[x]) {
w[++cnt] = 1, G[x].push_back(cnt), G[cnt].push_back(x);
do {
z = sta[stp--], ++w[cnt], G[z].push_back(cnt), G[cnt].push_back(z);
} while (z ^ y);
}
}
else
low[x] = min(low[x], dfn[y]);
}
void calc(int x, int f) {
siz[x] = vis[x] = x <= n;
L tmp = 0;
for (R int i = 0, y, S = G[x].size(); i < S; ++i)
if ((y = G[x][i]) ^ f)
calc(y, x), tmp += 2ll * siz[y] * siz[x], siz[x] += siz[y];
tmp += 2ll * siz[x] * (tot - siz[x]), ans += tmp * w[x];
}
int main() {
freopen("a.in", "r", stdin);
R int m, i, x, y;
cnt = n = rd(), m = rd();
for (i = 1; i <= m; ++i)
x = rd(), y = rd(), g[x].push_back(y), g[y].push_back(x);
for (i = 1; i <= n; ++i)
s[i] = g[i].size();
for (i = 1; i <= n; ++i)
if (!vis[i])
stp = 0, tot = 0, dfs(i), calc(i, 0);
printf("%lld", ans);
return 0;
}

[APIO2018] Duathlon 铁人两项 圆方树,DP的更多相关文章

  1. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

  2. LOJ 2587 「APIO2018」铁人两项——圆方树

    题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...

  3. loj2587 「APIO2018」铁人两项[圆方树+树形DP]

    主要卡在一个结论上..关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会.可以参见clz博 ...

  4. [BZOJ5463][APIO2018]铁人两项(圆方树DP)

    题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了 ...

  5. [APIO2018]铁人两项 --- 圆方树

     [APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...

  6. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  7. [APIO2018]铁人两项 [圆方树模板]

    把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...

  8. 洛谷P4630 铁人两项--圆方树

    一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...

  9. 洛谷P4630 [APIO2018] Duathlon 铁人两项 (圆方树)

    圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题. 在本题中,方点点权赋值为该点双的大小,因为两个点 ...

随机推荐

  1. .net 下使用Quartz.Net

    Quartz.net是作业调度框架 1. 项目中添加quartz.net的引用(这里使用nuget管理) 新建一个类TimingJob,该类主要用于实现任务逻辑 using Quartz; using ...

  2. asp.net中的<%%>的使用

    在asp.net中常见的<%%>方式有如下几种: <%%>.<%=%>.<%:%>.<%#%>.<%$%>.<%@%> ...

  3. 基于dispatch_after封装YXTimer

    基于dispatch_after封装YXTimer 本人根据dispatch_after封装了一个定时器,支持block以及代理的方式来激活定时器,适用于对精度要求低,耗时短的地方,高端大气上档次,低 ...

  4. 转载、Python的编码处理(二)

    以下转自于:wklken的博客,写的非常好的一段有关编码的总结. Python-进阶-编码处理小结 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 ...

  5. handsontable 和 echarts都定义了require方法,初始化时冲突了,怎么办?

    echarts初始化时报这个错误. require.config is not a function  方案一: 让其中一方的初始化不依赖于 require即可 1.去掉 var testDrowEc ...

  6. 数据库服务注册(使用命令注册):解决my.ini配置文件不存在的问题

    注册数据库的时候,有一键式安装,还有一种通过压缩包安装.今天主要来讲一下压缩包安装会出现的问题. 1. 新建一个my.ini文件,里面内容为: [client] port=3306 default-c ...

  7. 02-urllib库的get请求方式

    对于urllib中的get请求方式,可以直接传入url的连接即可访问页面,但是对于要传入关键字的话,也可以用quote进行编码再传入. 案例如下: #get请求搜索参数如何添加 import urll ...

  8. JQuery Mobile+JS实现智能浮动定位导航条

    实现原理 主要用到几个知识点: 什么是scrollTop? CSS position定位 判断是否为IE6浏览器 元素相对于窗口的距离 原理:1,浏览器向下滚动时,当document的scrollTo ...

  9. java面向切面编程总结-面向切面的本质

    面向切面的本质:定义切面类并将切面类的功能织入到目标类中: 实现方式:将切面应用到目标对象从而创建一个新的代理对象的过程.替换: 使用注解@Aspect来定义一个切面,在切面中定义切入点(@Point ...

  10. 一些需要禁用的PHP危险函数

    phpinfo()功能描述:输出 PHP 环境信息以及相关的模块.WEB 环境等信息.危险等级:中 passthru()功能描述:允许执行一个外部程序并回显输出,类似于 exec().危险等级:高 e ...