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博 ...
随机推荐
- bean中属性名和json不一致解决方案(请求和响应)
此时@RequestBody.@ResponseBody需要与@JsonProperty结合使用,才能做到请求正常解析,响应按要求格式返回. 注意@JsonProperty注解的位置需要加在gette ...
- [NOIP2013 提高组] 货车运输
前言 使用算法:堆优化 \(prim\) , \(LCA\) . 题意 共有 \(n\) 个点,有 \(m\) 条边来连接这些点,每条边有权值.有 \(q\) 条类似于 \(u\) \(v\) 询问, ...
- Redis--部署操作
1.Redis 1.1 安装 当前ubuntu虚拟机中已经安装好了redis,以下步骤可以跳过 以后自己安装过程如下:redis下载链接:x 指的是版本号 http://download.redis. ...
- java 多态 向上造型
最近在读java 编程思想,在读多态一章时,遇到了一个问题,在此记录一下. 1 package main.demo; 2 3 class Super{ 4 public int filed =0; 5 ...
- —用python写图片格式批量处理工具
python爬取微博评论(无重复数据) 前言 一.整体思路 二.获取微博地址 1.获取ajax地址 2.解析页面中的微博地址 3.获取指定用户微博地址 三.获取主评论 四.获取子评论 1.解析子评论 ...
- 达梦数据库学习(一、linux操作系统安装及数据库安装)
达梦数据库学习(一.linux操作系统安装及数据库安装) 环境介绍: 使用VM12+中标麒麟V7.0操作系统+达梦8数据库 一.linux系统搭建 本部分没有需要着重介绍,注意安装时基本环境选择&qu ...
- 浅谈ES6数组及对象的解构
一.数组的解构,ES6的新特性,主要是方便操作数组,节省不必要的代码,提高代码质量. 上图例子中, example1: 之前想要获取数组中的值,只能挨个获取下标,然后取值 example2:ES6新特 ...
- Java反编译反混淆神器 - CFR
最近有大量jar包需要反编译后使用,但是由于jar包中的类被混淆过了,直接反编译以后的里面所有的变量都是一个名字.所以这里介绍一个反混淆神器:CRF. 不知道是不是官网的链接:http://www.b ...
- 【Java基础】基本语法-变量与运算符
基本语法-变量与运算符 关键字和保留字 关键字定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词). 关键字特点:关键字中所有字母都为小写. 用于定义数据类型:class.interf ...
- 面试官:Netty的线程模型可不只是主从多Reactor这么简单
笔者看来Netty的内核主要包括如下图三个部分: 其各个核心模块主要的职责如下: 内存管理 主要提高高效的内存管理,包含内存分配,内存回收. 网通通道 复制网络通信,例如实现对NIO.OIO等底层JA ...