[APIO2018]铁人两项——圆方树+树形DP
题目链接:
对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次。
那么我们建出原图的圆方树,枚举中间点$b$,一对合法的$a,c$需要使这两个点位于与$b$直接相连的方点的不同子树中。树形$DP$,对圆点和方点分别统计答案即可。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,m;
int x,y;
vector<int>q[200010];
int head[100010];
int to[400010];
int next[400010];
int size[200010];
int low[100010];
int dfn[100010];
int tot;
int cnt;
int num;
int st[100010];
int top;
int vis[200010];
ll ans;
int sum;
void add(int x,int y)
{
tot++;
next[tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void insert(int x,int y)
{
q[x].push_back(y);
}
void tarjan(int x)
{
st[++top]=x;
low[x]=dfn[x]=++num;
for(int i=head[x];i;i=next[i])
{
if(!dfn[to[i]])
{
tarjan(to[i]);
low[x]=min(low[x],low[to[i]]);
if(low[to[i]]>=dfn[x])
{
insert(++cnt,x);
insert(x,cnt);
int now=0;
do
{
now=st[top--];
insert(cnt,now);
insert(now,cnt);
}
while(now!=to[i]);
}
}
else
{
low[x]=min(low[x],dfn[to[i]]);
}
}
}
void dfs(int x,int fa)
{
vis[x]=1;
size[x]=(x<=n?1:0);
int len=q[x].size();
for(int i=0;i<len;i++)
{
int to=q[x][i];
if(to!=fa)
{
dfs(to,x);
size[x]+=size[to];
}
}
}
void tree_dp(int x,int fa)
{
int len=q[x].size();
for(int i=0;i<len;i++)
{
int to=q[x][i];
if(to!=fa)
{
tree_dp(to,x);
}
}
if(x<=n)
{
for(int i=0;i<len;i++)
{
int to=q[x][i];
if(to!=fa)
{
ans+=1ll*size[to]*(sum-size[to]-1);
}
else
{
ans+=1ll*(sum-size[x])*(size[x]-1);
}
}
}
else if(len>=3)
{
for(int i=0;i<len;i++)
{
int to=q[x][i];
if(to!=fa)
{
ans+=1ll*size[to]*(sum-size[to])*(len-2);
}
else
{
ans+=1ll*(sum-size[x])*size[x]*(len-2);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);cnt=n;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
for(int i=1;i<=cnt;i++)
{
if(!vis[i])
{
dfs(i,0);
sum=size[i];
tree_dp(i,0);
}
}
printf("%lld",ans);
}
[APIO2018]铁人两项——圆方树+树形DP的更多相关文章
- loj2587 「APIO2018」铁人两项[圆方树+树形DP]
主要卡在一个结论上..关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会.可以参见clz博 ...
- [APIO2018]铁人两项 --- 圆方树
[APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- [APIO2018]铁人两项 [圆方树模板]
把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...
- [BZOJ5463][APIO2018]铁人两项(圆方树DP)
题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了 ...
- 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)
Description 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...
- LOJ 2587 「APIO2018」铁人两项——圆方树
题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...
- 洛谷P4630 铁人两项--圆方树
一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...
- 2019.03.29 bzoj5463: [APIO2018] 铁人两项(圆方树+树形dp)
传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c) ...
随机推荐
- linux Ubuntu14.04 make编译文件报错:No rule to make target `/usr/lib/libpython2.7.so', needed by `python/_pywraps2.so'. Stop.
错误过程:当“make”编译文件时报错No rule to make target `/usr/lib/libpython2.7.so', needed by `python/_pywraps2.so ...
- python列表操作大全
Python列表操作大全 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列 ...
- VBA数组(十四)
我们都知道,一个变量是一个存储值的容器. 有时,开发人员希望一次可以在一个变量中保存多个值. 当一系列值存储在单个变量中时,则称为数组变量. 数组声明 数组声明的方式与声明变量相同,只是数组变量的声明 ...
- MutationObserver
一.MutationObserver Config childList: 添加.删除目标节点的子节点时会收到通知(子节点的后代节点添加或删除时不会收到通知) attribute: 修改目标节点属性时会 ...
- 文件锁 flock/fcntl
多个进程同时操作一个文件 1. flock int flock(int fd, int operation); LOCK_SH 建立共享锁定.多个进程可同时对同一个文件作共享锁定(读锁定) LOCK_ ...
- lumen中安装及使用redis作为cache
1.安装redis模块在compose.json的require中添加 "predis/predis": "*","illuminate/redi ...
- linux 安装mysql(rpm文件安装)
三 卸载旧版本的MySql (没有的话,则跳过此步骤) 1.查看旧版本MySql rpm -qa | grep mysql 将会列出旧版本MySql的组件列表,如: ...
- nginx编译安装和功能介绍
nginx介绍 nginx: engine X,是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004 ...
- lua游戏开发易错踩坑录
一.local local函数一定要在调用之前定义(切记,不然会报错或者不能调用该函数) 情况1:监听调此函数后定义 base.model:addlistener("被监听的函数" ...
- SQL Server 2005的几个新功能
SQL Server 2005相对于SQL Server 2000改进很大,有些还是非常实用的. 举几个例子来简单说明 这些例子我引用了Northwind库. 1. TOP 表达式 SQL Serv ...