【APIO2018】铁人两项(圆方树,动态规划)

题面

UOJ

洛谷

BZOJ

题解

嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到

首先一棵树是很容易做的,随意指定起点终点就只能在两点路径上选择第三点。那么考虑过中点的路径个数,就可以很方便的\(dp\)计算了。

对于仙人掌而言,把环全部缩成点,转成树,缩起来的点额外定义一个点权,同样可以直接在树上做\(dp\),额外考虑环自身内部的贡献。

那么对于一般图而言,构建圆方树,那么选定起点和终点后,还是只能选择两点路径之间的圆点。定义方点的权值为点双的点数和,显然选定起点终点后,两点间的贡献就是路径上的点权和。然而这样子圆点会被算多,所以圆点的点权为\(-1\)。

那么又是一棵树了,直接枚举中间点考虑过中间点的路径个数即可。

#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 100100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Graph
{
struct Line{int v,next;}e[MAX<<3];
int h[MAX<<1],cnt=1;
inline void Add(int u,int v)
{
e[cnt]=(Line){v,h[u]};h[u]=cnt++;
e[cnt]=(Line){u,h[v]};h[v]=cnt++;
}
}Gr,Tr;
int n,m;ll ans;
int dfn[MAX],low[MAX],tim,S[MAX],top,tot,V[MAX<<1];
int size[MAX<<1],Size;
void Tarjan(int u)
{
dfn[u]=low[u]=++tim;S[++top]=u;++Size;
for(int i=Gr.h[u];i;i=Gr.e[i].next)
{
int v=Gr.e[i].v;
if(!dfn[v])
{
Tarjan(v);low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
{
Tr.Add(++tot,u);int x;V[tot]=1;
do{x=S[top--];Tr.Add(tot,x);++V[tot];}while(x!=v);
}
}
else low[u]=min(low[u],dfn[v]);
}
}
void dp(int u,int ff)
{
size[u]=u<=n;
for(int i=Tr.h[u];i;i=Tr.e[i].next)
{
int v=Tr.e[i].v;if(v==ff)continue;
dp(Tr.e[i].v,u);
ans+=2ll*V[u]*size[u]*size[v];
size[u]+=size[v];
}
ans+=2ll*V[u]*size[u]*(Size-size[u]);
}
int main()
{
n=tot=read();m=read();
for(int i=1;i<=m;++i)Gr.Add(read(),read());
for(int i=1;i<=n;++i)V[i]=-1;
for(int i=1;i<=n;++i)if(!dfn[i])Size=0,Tarjan(i),dp(i,0);
printf("%lld\n",ans);
return 0;
}

【APIO2018】铁人两项(圆方树,动态规划)的更多相关文章

  1. [APIO2018]铁人两项 --- 圆方树

     [APIO2018] 铁人两项 题目大意: 给定一张图,问有多少三元组(a,b,c)(a,b,c 互不相等)满足存在一条点不重复的以a为起点,经过b,终点为c的路径 如果你不会圆方树 ------- ...

  2. [APIO2018]铁人两项——圆方树+树形DP

    题目链接: [APIO2018]铁人两项 对于点双连通分量有一个性质:在同一个点双里的三个点$a,b,c$,一定存在一条从$a$到$c$的路径经过$b$且经过的点只被经过一次. 那么我们建出原图的圆方 ...

  3. [APIO2018]铁人两项 [圆方树模板]

    把这个图缩成圆方树,把方点的权值设成-1,圆点的权值设成点双的size,算 经过这个点的路径的数量*这个点的点权 的和即是答案. #include <iostream> #include ...

  4. [BZOJ5463][APIO2018]铁人两项(圆方树DP)

    题意:给出一张图,求满足存在一条从u到v的长度大于3的简单路径的有序点对(u,v)个数. 做了上一题[HDU5739]Fantasia(点双连通分量+DP),这个题就是一个NOIP题了. 一开始考虑了 ...

  5. [APIO2018] Duathlon 铁人两项 圆方树,DP

    [APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...

  6. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...

  7. LOJ 2587 「APIO2018」铁人两项——圆方树

    题目:https://loj.ac/problem/2587 先写了 47 分暴力. 对于 n<=50 的部分, n3 枚举三个点,把图的圆方树建出来,合法条件是 c 是 s -> f 路 ...

  8. loj2587 「APIO2018」铁人两项[圆方树+树形DP]

    主要卡在一个结论上..关于点双有一个常用结论,也经常作为在圆方树/简单路径上的良好性质,对于任意点双内互不相同的三点$s,c,t$,都存在简单路径$s\to c\to t$,证明不会.可以参见clz博 ...

  9. 洛谷P4630 铁人两项--圆方树

    一道很好的圆方树入门题 感谢PinkRabbit巨佬的博客,讲的太好啦 首先是构建圆方树的代码,也比较好想好记 void tarjan(int u) { dfn[u] = low[u] = ++dfn ...

  10. [APIO2018]铁人两项(圆方树)

    过了14个月再重新看这题,发现圆方树从来就没有写过.然后写了这题发现自己APIO2018打铁的原因竟然是没开long long,将树的部分的O(n)写挂了(爆int),毕竟去年APIO时我啥都不会,连 ...

随机推荐

  1. 软工网络15团队作业4——Alpha阶段敏捷冲刺

    Deadline: 2018-4-29 10:00PM,以提交至班级博客时间为准. 根据以下要求,团队在日期区间[4.16,4.29]内,任选8天进行冲刺,冲刺当天晚10点前发布一篇随笔,共八篇. 另 ...

  2. docker vm 性能优劣

    Docker容器与虚拟机区别 - unixfbi.com - 博客园 http://www.cnblogs.com/pangguoping/articles/5515286.html docker与虚 ...

  3. php 删除一维数组中某一个值元素的操作方法

    1. 自己写for循环 从array里去掉$tmp这个元素的值 ? 1 2 3 4 5 6 7 8 9 10 <?php $tmp = '324'; $arr = array( '0' => ...

  4. Day 3-3 内置方法

    常用内置函数方法: min,max li = [1, 2, 3, 6, 9, 5, 10, 26] print('li的最小值是:', min(li)) # 取最小值 print('li的最大值是:' ...

  5. NOIP2016提高组复赛C 愤怒的小鸟

    题目链接:http://uoj.ac/problem/265 题目大意: 太长了不想概括... 分析: 状压DP的模板题,把所有可能的抛物线用二进制表示,然后暴力枚举所有组合,详情见代码内注释 代码如 ...

  6. bootStrap的使用

    1.首先要打开bootstrap的官网 点进去 2你会看到下面这样一个页面里面有很多组件 这里面的代码是实现组件功能的核心代码,还不能直接使用,要引入相关的js css 我们要在起步中下载相关的页面下 ...

  7. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  8. python设计模式第二十三天【状态模式】

    1.应用场景 (1)通过改变对象的内部状态从而改变对象的行为,一般表现为状态的顺序执行 2.代码实现 #!/usr/bin/env python #!_*_ coding:UTF-8 _*_ from ...

  9. python设计模式第五天【单例模式】

    1. 定义 一个类只有一个实例,提供访问该实例的全局方法 2.应用场景 (1)多线程之间共享对象资源 (2)整个程序空间中的全局变量,共享资源 (3)大规模程序的节省创建对象的时间 3.代码实现(使用 ...

  10. 阿里云ECS服务器,CentOS 7.4配置jdk+tomcat+mysql

    参考博客: https://mp.weixin.qq.com/s?__biz=MzIxMzk3Mjg5MQ==&mid=2247484020&idx=1&sn=6e0aa07f ...