[Luogu P4630] [BZOJ 5463] [APIO2018] Duathlon 铁人两项
洛谷传送门
BZOJ传送门
题目描述
比特镇的路网由 mmm 条双向道路连接的 nnn 个交叉路口组成。
最近,比特镇获得了一场铁人两项锦标赛的主办权。这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段赛程。
比赛的路线要按照如下方法规划:
- 先选择三个两两互不相同的路口 s,cs, cs,c和 fff,分别作为比赛的起点、切换点(运动员在长跑到达这个点后,骑自行车前往终点)、终点。
- 选择一条从 sss 出发,经过 ccc 最终到达 fff 的路径。考虑到安全因素,选择的路径经过同一个点至多一次。
在规划路径之前,镇长想请你帮忙计算,总共有多少种不同的选取 s,cs, cs,c和 fff的方案,使得在第 222步中至少能设计出一条满足要求的路径。
输入输出格式
输入格式:
第一行包含两个整数 nnn和 mmm ,分别表示交叉路口和双向道路的数量。
接下来 mmm行,每行两个整数 vi,uiv_i, u_ivi,ui 。表示存在一条双向道路连接交叉路口 vi,uiv_i, u_ivi,ui (1≤vi,ui≤n,vi≠ui)(1 ≤ v_i, u_i ≤ n,v_i \neq u_i)(1≤vi,ui≤n,vi̸=ui)。
保证任意两个交叉路口之间,至多被一条双向道路直接连接。
输出格式:
输出一行,包括一个整数,表示能满足要求的不同的选取 s,cs, cs,c 和 fff 的方案数。
输入输出样例
输入样例#1:
4 3
1 2
2 3
3 4
输出样例#1:
8
输入样例#2:
4 4
1 2
2 3
3 4
4 2
输出样例#2:
14
解题分析
显然缩出点双后, 确定两点之间可以选的中间点就是路径上所有点和点双的点数之和。
考虑把单独一条边也视为一个点双, 那么建出圆方树, 把方点的权值设为点双的大小, 原点的权值设为−1-1−1, 路径上可选中间点数恰好就是路径和, 然后可以转化为计算每点的贡献。
总复杂度O(N)O(N)O(N)。
代码如下:
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#define R register
#define IN inline
#define MX 200500
#define gc getchar()
#define ll long long
template <class T>
IN void in(T &x)
{x = 0; R char c = gc;for (; !isdigit(c); c = gc);for (; isdigit(c); c = gc)x = (x << 1) + (x << 3) + c - 48;
}
template <class T> IN T max(T a, T b) {return a > b ? a : b;}
template <class T> IN T min(T a, T b) {return a < b ? a : b;}
int n, m, top, arr, dcnt, sum, cnt;
int head[MX], val[MX], siz[MX], dfn[MX], low[MX], sta[MX], h[MX];
ll ans;
struct Edge {int to, nex;} edge[MX << 2];
IN void add1(R int from, R int to)
{edge[++cnt] = {to, head[from]}, head[from] = cnt;}
IN void add2(R int from, R int to)
{edge[++cnt] = {to, h[from]}, h[from] = cnt;}
void tarjan(R int now)
{dfn[now] = low[now] = ++dcnt;sta[++top] = now; val[now] = -1; ++sum;for (R int i = head[now]; i; i = edge[i].nex){if (!dfn[edge[i].to]){tarjan(edge[i].to);low[now] = min(low[now], low[edge[i].to]);if (low[edge[i].to] == dfn[now]){add2(now, ++arr); val[arr] = 1; int tp = 0;do{tp = sta[top--]; add2(arr, tp);++val[arr];} while (tp ^ edge[i].to);}}else low[now] = min(low[now], dfn[edge[i].to]);}
}
void solve(R int now)
{if (now <= n) siz[now] = 1;for (R int i = h[now]; i; i = edge[i].nex){solve(edge[i].to);ans += 1ll * siz[now] * siz[edge[i].to] * val[now];siz[now] += siz[edge[i].to];}ans += 1ll * (sum - siz[now]) * siz[now] * val[now];
}
int main(void)
{int a, b; in(n), in(m); arr = n;for (R int i = 1; i <= m; ++i){in(a), in(b);add1(a, b), add1(b, a);}for (R int i = 1; i <= n; ++i)if (!dfn[i]) sum = 0, tarjan(i), solve(i);printf("%lld\n", ans * 2);
}
[Luogu P4630] [BZOJ 5463] [APIO2018] Duathlon 铁人两项相关推荐
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...
- [APIO2018] Duathlon 铁人两项
题面 \(LOJ\)自己找.. Sol 建立圆方树 考虑枚举起点\(s\)和终点\(t\) 那么答案就是\(s\)到\(t\)间的点双的点数和减去\(s,t\) 设方点权值为点双的点数,圆点的权值为\ ...
- 【APIO2018】Duathlon 铁人两项 【圆方树】
题意:给一张 nnn 点 mmm 边的简单无向图,求有多少个三元组 (s,c,f)(s,c,f)(s,c,f) ,满足存在一条从 sss 到 fff 经过 ccc 的简单路径. n≤105,m≤2×1 ...
- P4630-[APIO2018]Duathlon铁人两项【圆方树】
正题 题目链接:https://www.luogu.com.cn/problem/P4630 题目大意 nnn个点mmm条边的一张无向图,求有多少对三元组(s,c,f)(s,c,f)(s,c,f)满足 ...
- [APIO2018]铁人两项——圆方树+树形DP
题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...
- LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)
题目链接 LOJ 洛谷P4630 先对这张图建圆方树. 对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和. 因为两 ...
- Luogu P1198 BZOJ 1012 最大数 (线段树)
Luogu P1198 BZOJ 1012 最大数 (线段树) 手动博客搬家: 本文发表于20170821 14:32:05, 原地址https://blog.csdn.net/suncongbo/a ...
- 体验式培训之“铁人七项”
铁人七项: 铁人七项项目的挑战点是在120秒的时间内完成7项任务,第7项子任务必须最后一个完成,这七项任务中有团队整体完成,有部分成员完成. 1.全组15位成员脚不着地,踩在3张30cm*30cm的垫 ...
- 移动应用开发者应该关注的 Google I/O 两项更新
移动应用开发者看过来,今年 Google I/O 这两项更新能帮上大忙 移动应用开发者看过来,今年 Google I/O 这两项更新能帮上大忙. I/O 的 Keynote 刚刚结束,用户可能为 Go ...
最新文章
- Linux vsftp服务
- 域名CNAME 概念
- 数据库死锁及解决方法
- Flutter React编程范式实践
- Linux基础命令---findfs
- 美国安全厂商在云安全上的最新进展
- (翻译)Google Guava Cache
- 吉利汽车发布澄清公告:并未与百度公司合作生产智能电动车
- 使用python,生成符合zipf分布的数据集
- 新知实验室 TRTC实时音视频通讯方案在业内的QoS水平
- 安卓psp模拟器联机教程_谁知道手机版的ppsspp模拟器怎么联机啊?
- 用python开发一个炸金花小游戏,注意别玩上瘾了
- 常用图形渲染API简介
- 微信公众号【程序员杂货铺】
- 关于ERP系统,你可能不知道的10件事
- 【TCP/IP学习笔记1】 C语言讲解
- MMA-符号学运算的奥妙
- 视频按帧截取 python程序
- 江南style印证法国大预言家诺查丹玛斯世界末日预言?
- 关于SEO(搜索引擎优化)的个人掌握知识分享
热门文章
- python数据建模与预测_Python建模复习:预测型数据挖掘
- win10证书服务器不可用怎么办,四种方法解决Win10专业版RPC服务器不可用的问题...
- java speex转码_JAVA版-微信语音.speex转.wav
- 计算机桌面没有cdef,如何解决电脑CDEF盘都打不开出现“该文件没有程序与之关联来执行该操作”的问题...
- EndNote无法修改参考文献格式
- Mysql读写分离的原理及配置--amoeba
- java项目实现html转pdf的需求(支持中文和CSS样式)
- HTML5高级之拖拽drag
- mysql 32位_MySQL8下载 MySQL 8 for windows 32位 v8.0.18 官方免费正式版 下载-脚本之家
- linux一键安装lamp教程,CentOS7下LAMP一键安装包教程