loj2587铁人两项
无向图,图中选出定点三元组(a,b,c),a->b->c的路径没有重复边。问方案有多少?
————————————————————————————————————————————
首先求出圆方树,方点权值为连接的圆点数量,圆点权值为-1
这时,枚举a,c点,b点的方案数为a,c路径上的点权和。
枚举a,c点然后计算点权和明显超时。于是我们枚举b点,计算通过它的方案数。
所以神搜后有三种可能,b点的各个子分支与其它点,b点的向上分支与其它点,如果b点为a或c点的情况
————————————————————————————————————————————

1 #include <bits/stdc++.h>
2 using namespace std;
3 const int maxn = 2e5 + 10, maxm = 8e5 + 10;
4 int n, m, cnt;
5 struct edge {
6 int u, v, nxt;
7 } e[maxm], ee[maxm];
8 int head[maxn], js, headd[maxn], jss;
9 void addage(int u, int v) {
10 e[++js].u = u;
11 e[js].v = v;
12 e[js].nxt = head[u];
13 head[u] = js;
14 }
15 void addagee(int u, int v) {
16 ee[++jss].u = u;
17 ee[jss].v = v;
18 ee[jss].nxt = headd[u];
19 headd[u] = jss;
20 }
21 int dfn[maxn], low[maxn], tim, sta[maxn], top, pw[maxn];
22 int sum, siz[maxn];
23 bool vis[maxn];
24 void tarjan(int u, int fa) {
25 dfn[u] = low[u] = ++tim;
26 sta[++top] = u;
27 for (int i = head[u]; i; i = e[i].nxt) {
28 int v = e[i].v;
29 if (!dfn[v]) {
30 tarjan(v, u);
31 low[u] = min(low[v], low[u]);
32 if (low[v] >= dfn[u]) {
33 cnt++;
34 int tp = 0;
35 while (tp != v) {
36 tp = sta[top--];
37 addagee(cnt, tp);
38 addagee(tp, cnt);
39 pw[cnt]++;
40 pw[tp] = -1;
41 }
42 addagee(cnt, u);
43 addagee(u, cnt);
44 pw[cnt]++;
45 pw[u] = -1;
46 }
47 } else if (v != fa)
48 low[u] = min(low[u], dfn[v]);
49 }
50 }
51 long long ans;
52 void dfs1(int u, int fa) {
53 vis[u] = 1;
54 siz[u] = (u <= n);
55 for (int i = headd[u]; i; i = ee[i].nxt) {
56 int v = ee[i].v;
57 if (v == fa)
58 continue;
59 dfs1(v, u);
60 siz[u] += siz[v];
61 }
62 }
63 void dfs2(int u, int fa) {
64 for (int i = headd[u]; i; i = ee[i].nxt) {
65 int v = ee[i].v;
66 if (v == fa)
67 continue;
68 dfs2(v, u);
69 ans += (long long)pw[u] * (sum - siz[v]) * siz[v]; // u的每一个子分支与其它点的
70 }
71 ans += (long long)pw[u] * (sum - siz[u]) * siz[u]; // u向上的分支与其它的点
72 if (u <= n)
73 ans += (long long)pw[u] * (sum - 1); // u作为端点
74 }
75 int main() {
76 scanf("%d%d", &n, &m);
77 for (int u, v, i = 0; i < m; ++i) {
78 scanf("%d%d", &u, &v);
79 addage(u, v);
80 addage(v, u);
81 }
82 cnt = n;
83 for (int i = 1; i <= n; ++i)
84 if (!dfn[i])
85 tarjan(i, 0);
86 for (int i = 1; i <= n; ++i)
87 if (!vis[i]) {
88 dfs1(i, 0);
89 sum = siz[i];
90 dfs2(i, 0);
91 }
92 cout << ans;
93
94 return 0;
95 }
loj2587铁人两项的更多相关文章
- 【APIO2018】铁人两项
[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...
- 【APIO2018】铁人两项(圆方树,动态规划)
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...
- 【刷题】LOJ 2587 「APIO2018」铁人两项
题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段 ...
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- [APIO2018]铁人两项 --- 圆方树
[APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...
- [Luogu4630][APIO2018]Duathlon 铁人两项
luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...
- [APIO2018]铁人两项 [圆方树模板]
把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...
- [APIO2018]铁人两项——圆方树+树形DP
题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...
- loj2587 「APIO2018」铁人两项[圆方树+树形DP]
主要卡在一个结论上..关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会.可以参见clz博 ...
随机推荐
- docker 使用教程1
1.概念理解 镜像:docker镜像就像一个个模具. 容器:docker容器就是模具翻模出来的东西. 仓库:仓库就是存放模具的地方. 下面通过运行 hello-world 来理解 docker镜像运行 ...
- 用漫画的形式展现——什么是web
Web主要经历了web1.0和web2.0的阶段.万维网的初期都是web1.0的时代:静态页面. 在不同的时代,流行的web安全问题也不太相同.在web1.0时代,web安全主要是 Web1.0:sq ...
- “开源、共享、创新” 2020 中国.NET开发者大会小结
大会的新闻稿在2020年12月31日正式发布:开源·共享·创新|2020年中国.NET开发者大会圆满收官! , 本文是这篇新闻的补充性文章,仅代表个人对大会的各方面分享内容的一个小结. 在2019年上 ...
- 安装Linux Deploy和Termux之后,再安装ftp服务软件都是多余的!
之前以为Debian 9 running via Linux Deploy或者Termux在安卓系统部署之后,一定要安装vsftpd或者pure-ftpd这些专门的ftp服务器软件,才能提供ftp服务 ...
- 拍摄、剪辑vlog的思路
这篇文章是看了很多狂阿弥_ 的作品后 产生的一些小小总结.这些技法只是锦上添花,阿弥作品真正好的地方在于他细腻的情感,真实的对白,和打动人心的满分作文. 优秀的Vlog ,在于它和观众产生的情感共鸣. ...
- TCP/IP五层模型-传输层-UDP协议
1.定义:UDP:是非面向连接.不可靠的用户数据包协议. 2.应用场景:适合对数据完整性要求不高,但对延迟很敏感,比如即时通信(语音视频聊天等). 3.UDP报文格式: 4.用UDP传输数据的应用层 ...
- 从一次生产消费者的bug看看线程池如何增加线程
0 背景 某个闲来无事的下午,看到旧有的项目中,有个任务调度的地方都是同步的操作,就是流程A的完成依赖流程B,流程B的完成依赖流程C,按此类推. 作为一名垃圾代码生产者,QA的噩梦.故障报告枪手的我来 ...
- 【Linux】1、命令行及命令参数
命令行及命令参数 文章目录 命令行及命令参数 1.命令行提示符 2.命令和命令参数 简单的命令 date ls 命令参数 短参数(一个字母) 长参数(多个字母) 参数的值 其它参数 3.小结 4.参考 ...
- 【Java】集合综合案例 - 播放器管理
集合综合案例 文章目录 集合综合案例 需求分析 项目演示 详细设计 代码实现 歌曲类 播放器类 播放列表类 测试 参考资料 播放器管理 需求分析 项目演示 详细设计 代码实现 重新搞一波 复习巩固 简 ...
- oracle dg库因为standby_file_management参数导致应用停止
DG库的standby_file_management=manual,主库添加文件的时候,备库无法自动创建对应的文件而报错 File #154 added to control file as 'UN ...