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博 ...
随机推荐
- Oracle数据库常见sql
-新建表:create table table_name( id varchar2(300) primary key, name varchar2(200) not null); --插入数据 ins ...
- Cys_Control(六) MTreeView
说明:由于Cefsharp浏览器项目需要各类控件,故之后的一些定义控件样式会参照Edge浏览器深色主题样式开发 一.查看TreeView原样式 1.通过Blend查看TreeView原有样式 < ...
- [leetcode]120.Triangle三角矩阵从顶到底的最小路径和
Given a triangle, find the minimum path sum from top to bottom.Each step you may move to adjacent nu ...
- jQuery是如何实现?
jQuery是什么? jQuery就是一个javascript的类库,函数库. jQuery是如何实现的? jQuery采用的是构造函数模式进行开发的,jQuery是一个类 常用的方法(CSS.属性. ...
- java final思考
final关键之主要用在三个方向: 数据 对于基本类型,final使数据恒定不变:而对于对象引用,final使引用恒定不变即无法再重新new另一个对象给他: 空白final JAVA允许定义一个空白f ...
- [剑指 Offer 18. 删除链表的节点]
[剑指 Offer 18. 删除链表的节点] 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点. 返回删除后的链表的头节点. 注意:此题对比原题有改动 示例 1: 输入: head ...
- 聊聊风口上的 eBPF
eBPF 是一个用于访问 Linux 内核服务和硬件的新技术,由于其灵活性和高性能等特点,被迅速用于网络.出错.跟踪以及防火墙等多场景.目前国内已有少数企业开始尝试将 eBPF 引入生产实践,又拍云也 ...
- LeetCode498 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], ...
- 浅谈JVM垃圾回收
JVM内存区域 要想搞懂啊垃圾回收机制,首先就要知道垃圾回收主要回收的是哪些数据,这些数据主要在哪一块区域. Java8和Java8之前的相同点有很多. 都有虚拟机栈,本地方法栈,程序计数器,这三个是 ...
- MySQL查询优化之 index 索引的分类和使用
索引的分类 主键索引 (PRIMARY KEY) 唯一的标识符, 主键不可重复, 只能有一列作为主键 唯一索引 (Unique KEY) 避免重复的列出现, 唯一索引可以重复, 多个列都可以标识为唯一 ...