解题:APIO 2018 铁人两项
建立圆方树,考虑所有路径,发现路径上原来的点双(现在的方点)里的点都可以做中间点。但是路径上被方点夹着的圆点被计重了,要扣掉;枚举的两个端点也被算进去了,要扣掉。所以直接将方点权值设为点双大小,圆点权值设为-1,所有圆点间路径权值和的和即为答案
注意图可能不连通,草(汉语)
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
int n,m,r,c,t1,t2,cnt,Cnt,tot,top; long long sum,ans;
int dfn[N],low[N],col[N],isc[N],stk[N],siz[N],dis[N];
int p[N],noww[M],goal[M],P[N],Noww[M],Goal[M],val[N];
vector<int> ve[N];
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
void Linka(int f,int t)
{
Noww[++Cnt]=P[f];
Goal[Cnt]=t,P[f]=Cnt;
Noww[++Cnt]=P[t];
Goal[Cnt]=f,P[t]=Cnt;
}
void Tarjan_PBC(int nde)
{
int tep=; stk[++top]=nde;
dfn[nde]=low[nde]=++tot;
for(int i=p[nde];i;i=noww[i])
if(!dfn[goal[i]])
{
Tarjan_PBC(goal[i]);
low[nde]=min(low[nde],low[goal[i]]);
if(dfn[nde]<=low[goal[i]])
{
if(nde!=r||++tep>) isc[nde]=true;
int tmp; c++;
do
{
tmp=stk[top--],col[tmp]=c;
ve[c].push_back(tmp);
}while(tmp!=goal[i]);
ve[c].push_back(nde);
}
}
else low[nde]=min(low[nde],dfn[goal[i]]);
}
void DFS(int nde,int fth)
{
if(nde<=n) siz[nde]=;
for(int i=P[nde];i;i=Noww[i])
if(Goal[i]!=fth) DFS(Goal[i],nde),siz[nde]+=siz[Goal[i]];
}
void Getans(int nde,int fth)
{
long long tmp=;
int sizz=tot-siz[nde];
for(int i=P[nde];i;i=Noww[i])
if(Goal[i]!=fth)
{
int G=Goal[i],S=siz[G];
tmp+=1ll*sizz*S,sizz+=S;
Getans(Goal[i],nde);
}
if(nde<=n) ans-=(tmp+tot-)*;
else ans+=*tmp*val[nde];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
scanf("%d%d",&t1,&t2),Link(t1,t2);
for(int i=;i<=n;val[i]=-,i++)
if(!dfn[i]) r=i,Tarjan_PBC(i);
for(int i=;i<=c;i++)
{
val[n+i]=ve[i].size();
for(int j=;j<val[n+i];j++)
Linka(n+i,ve[i][j]);
}
for(int i=;i<=n;i++)
if(!siz[i]) DFS(i,),tot=siz[i],Getans(i,);
printf("%lld",ans);
return ;
}
解题:APIO 2018 铁人两项的更多相关文章
- 【APIO2018】铁人两项(圆方树,动态规划)
[APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...
- [Luogu4630][APIO2018]Duathlon 铁人两项
luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...
- 【APIO2018】铁人两项
[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...
- 【刷题】LOJ 2587 「APIO2018」铁人两项
题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段 ...
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- [APIO2018]铁人两项 --- 圆方树
[APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...
- [APIO2018]铁人两项 [圆方树模板]
把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...
- [APIO2018]铁人两项——圆方树+树形DP
题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...
- 【APIO 2018】铁人两项(圆方树)
题目链接 题意大概是,求有多少三元组$(s,c,f)(s \neq c, c \neq f, s \neq f)$,满足从$s$到$f$有一条简单路径经过$c$. 得到结论: 点双中任意互不相同的三个 ...
随机推荐
- 【Win32 API】利用SendMessage实现winform与wpf之间的消息传递
原文:[Win32 API]利用SendMessage实现winform与wpf之间的消息传递 引言 有一次心血来潮,突然想研究一下进程间的通信,能够实现消息传递的方法有几种,其中win32ap ...
- Luogo P2324 [SCOI2005]骑士精神
所有想练习A*的人都先来敲一下这道题吧. 数据范围即便只有5*5,但朴素的爆搜还是会超时. 因此考虑剪枝. 对于这道题,肯定只要进行最优化剪枝,判断现在走的步数+剩下最少要走的步数,如果大于ans或者 ...
- Docker-compose部署gitlab中文版
目录 Docker-compose部署gitlab 1.安装Docker 2.安装Docker-compose 3.安装Gitlab Docker-compose部署gitlab 1.安装Docker ...
- 5.Xilinx RapidIO核例子工程源码分析
https://www.cnblogs.com/liujinggang/p/10091216.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:V ...
- stl源码剖析 详细学习笔记 空间配置器
//---------------------------15/04/05---------------------------- /* 空间配置器概述: 1:new操作包含两个阶段操作 1>调 ...
- React半科普文
React半科普文 什么是React getting started 文件分离 Server端编译 定义一个组件 使用property 组件嵌套 组件更新 Virtual DOM react nati ...
- DMS专线联通外网测试
配置 CE Ping PE: “本地链接”-->属性-->"Internet 协议版本4(TCP/IPv4)",选择“使用下面的IP”,填写“172.16.10.21” ...
- python中字符串的常见操作方法
1. 字符串概念,字符串是一个容器,包含若干个字符并按照一定的顺序组织成一个整体.字符串支持索引操作. 2. 创建字符串基本语法 变量名 = "字符串信息" 变量名 = '字符串信 ...
- 关于GitHub上传没有记录(小绿块不显示的问题)
最近开始使用上github来上传保存自己在学习中所写过的代码,打算将自己每天的成果能有个保存,然后就利用上GitHub这么一个利器. 听说GitHub的那个绿块是用来记录每天的上传记录的,结果我将代码 ...
- Docker操作命令
docker --直接输入 docker 命令来查看到 Docker 客户端的所有命令选项. docker [command] --help --深入的了解指定的 Docker 命令使用方法 dock ...