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博 ...
随机推荐
- [LeetCode]690. Employee Importance员工重要信息
哈希表存id和员工数据结构 递归获取信息 public int getImportance(List<Employee> employees, int id) { Map<Integ ...
- Spring boot 启动错误处理:Action: Consider the following: If you want an embedded database (H2, HSQL or Derby), please put it on the classpath. If you have database settings to be loaded from a particular...
错误原因 在pom中引入了mybatis-spring-boot-starter ,Spring boot默认会加载org.springframework.boot.autoconfigure.jdb ...
- Vue - MVVM模式及优点
MVVM模式 视图层和数据层的双向绑定,让我们无需再去关心DOM操作的事情,更多的精力放在数据和业务逻辑上去 MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想. Mod ...
- CAP理论和BASE理论及数据库的ACID中关于一致性及不同点的思考
CAP定理又被称作是布鲁尔定理,是加州大学伯克利分销计算机科学家里克在2000年提出,是分布式理论基础. CAP:是分布式系统的理论基础 [一致性 可用性 分区容错性] BASE理论是对CAP中 ...
- canvas--总结二
canvas图形绘制 矩形绘制 rect(x,y,w,h) 没有独立路径 strokeRect(x,y,w,h) 有独立路径,不影响别的绘制 fillRect(x,y,w,h) 有独立路径,不影响别 ...
- livy提交spark应用
spark-submit的使用shell时时灵活性较低,livy作为spark提交的一种工具,是使用接口或者java客户端的方式提交,可以集成到web应用中 1.客户端提交的方式 http://l ...
- 风炫安全WEB安全学习第二十一节课 存储型XSS讲解
风炫安全WEB安全学习第二十一节课 存储型XSS讲解 存储型XSS演示 存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存 ...
- 剑指offer 树的基本操作:四种遍历方式
前序遍历 递归版 编程思想 即借助系统栈,效率较低.二叉树的前序遍历规则:1. 访问根结点: 2. 遍历左子树: 3. 遍历右子树 编程实现 //树的定义 struct TreeNode { int ...
- 转载 - Ubuntu源改国内源 与 批量更改ubuntu机器apt源
change_apt_source.sh # !/bin/bash # 备份原来的源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak # 获取 ...
- ios获取缓存文件的大小并清除缓存
移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...