题目链接 LOJ

洛谷P4630

先对这张图建圆方树。

对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和。

因为两方点之间的圆点会计算两次,所以圆点权值设为-1就好了。

那么现在有 \(n^2\) 个点对,求每个点对之间的路径上点的权值和。

对每个点计算一下被计算次数就可以了。这个路径次数计算注意考虑全。。

另外点对是圆点间的,所以方点初始sz[]为0,圆点的sz[]才是1。

方点其实建一条边就可以。

LOJ为什么找不到代码框的位置了。。交了两次文件CE了两次,是代码不能加注释?

好了 原来网页放大后代码框就没了。。

//344ms    11.82MB/2573ms	12668K
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=100005<<1,M=4e5+7;//2N!→_→ int n,m,tot,sk[N],top,dfn[N],low[N],Index,fa[N],sz[N],val[N];
long long Ans;
struct Graph
{
int H[N],Enum,to[M],nxt[M];
inline void Add_E(int u,int v){
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum;
}
inline void AddEdge(int u,int v){
Add_E(u,v), Add_E(v,u);
}
}G,T; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
void Tarjan(int x)
{
dfn[x]=low[x]=++Index, sk[++top]=x, val[x]=-1;
for(int v,i=G.H[x]; i; i=G.nxt[i])
if(!dfn[v=G.to[i]])
{
fa[v]=x, Tarjan(v), low[x]=std::min(low[x],low[v]);
if(dfn[x]<=low[v])
{
T.Add_E(x,++tot), val[tot]=1;
do{
T.Add_E(tot,sk[top--]), ++val[tot];
}while(sk[top+1]!=v);//别在这把x弹掉。。x可能是多个环的根节点。
}
}
else low[x]=std::min(low[x],dfn[v]);
}
void pre_DFS(int x,int f)//这个dfs还是可以省的吧...
{
if(x<=n) sz[x]=1;
for(int i=T.H[x]; i; i=T.nxt[i])
if(T.to[i]!=f) pre_DFS(T.to[i],x), sz[x]+=sz[T.to[i]];
}
void Solve(int x,int f,int tot)
{
if(x<=n) Ans+=1ll*(tot-1)*val[x];//以x为起点的路径数
Ans+=1ll*(tot-sz[x])*sz[x]*val[x];//起点在x到根方向的一侧,终点在另一侧
for(int i=T.H[x]; i; i=T.nxt[i])
Ans+=1ll*val[x]*(tot-sz[T.to[i]])*sz[T.to[i]], Solve(T.to[i],x,tot);//起点在子树方向,终点到其它地方去(包括x)
//注意刚开始算了个以x为起点的数,直接交换起点终点(*2)是不对的!
}
//void Solve(int x,int f,int tot)
//{
// if(x<=n) Ans+=2ll*(tot-1)*val[x];//以x为起点&终点的路径数
// int sum=tot-sz[x];
// for(int i=T.H[x]; i; i=T.nxt[i])
// Ans+=2ll*val[x]*sum*sz[T.to[i]], sum+=sz[T.to[i]], Solve(T.to[i],x,tot);
//} int main()
{
tot=/*!*/n=read(),m=read();
while(m--) G.AddEdge(read(),read());
for(int i=1; i<=n; ++i)//不一定连通。。这个很坑
if(!dfn[i]) Tarjan(i), pre_DFS(i,i), Solve(i,i,sz[i]);
printf("%lld",Ans); return 0;
}

LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)的更多相关文章

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

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

  2. 2019.03.29 bzoj5463: [APIO2018] 铁人两项(圆方树+树形dp)

    传送门 题意简述:给你一张无向图,问你满足存在从a−>b−>ca->b->ca−>b−>c且不经过重复节点的路径的有序点对(a,b,c)(a,b,c)(a,b,c) ...

  3. 洛谷P4630 [APIO2018]铁人两项 [广义圆方树]

    传送门 又学会了一个新东西好开心呢~ 思路 显然,假如枚举了起始点\(x\)和终止点\(y\),中转点就必须在它们之间的简单路径上. 不知为何想到了圆方树,可以发现,如果把方点的权值记为双联通分量的大 ...

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

    [APIO2018]铁人两项(圆方树,动态规划) 题面 UOJ 洛谷 BZOJ 题解 嘤嘤嘤,APIO的时候把一个组合数写成阶乘了,然后这题的70多分没拿到 首先一棵树是很容易做的,随意指定起点终点就 ...

  5. 洛谷P4630 [APIO2018] Duathlon 铁人两项 (圆方树)

    圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题. 在本题中,方点点权赋值为该点双的大小,因为两个点 ...

  6. 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】

    题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...

  7. 【APIO 2018】铁人两项(圆方树)

    题目链接 题意大概是,求有多少三元组$(s,c,f)(s \neq c, c \neq f, s \neq f)$,满足从$s$到$f$有一条简单路径经过$c$. 得到结论: 点双中任意互不相同的三个 ...

  8. 洛谷4630APIO2018铁人两项(圆方树+dp)

    QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我 ...

  9. P4630-[APIO2018]Duathlon铁人两项【圆方树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4630 题目大意 \(n\)个点\(m\)条边的一张无向图,求有多少对三元组\((s,c,f)\)满足\(s\ne ...

随机推荐

  1. Spring4笔记3--Bean的装配

    Bean的装配: Bean 的装配,即 Bean 对象的创建.容器根据代码要求创建 Bean 对象后再传递给代码的过程,称为 Bean 的装配. 1. 创建Bean对象的方式: 1. 通过 getBe ...

  2. python pachong zhuanzai

    come from:http://www.cnblogs.com/dyllove98/archive/2013/07/12/3187186.html 先来说一下我们学校的网站: http://jwxt ...

  3. v8-su-root

    1.下载userdebug版本 2.设置模块打开develop options 3.勾选usb debugging 4.adb remount 5.解压SuperSU_N.7z(联系我索取)并push ...

  4. caffe卷积操作

  5. IntelliJ IDEA + Tomcat 部署问题

    首先要了解下 tomcat的 几种部署方式(大致分为静态部署和动态部署),可以百度,博客:http://qsfwy.iteye.com/blog/466461 IntelliJ IDEA 下部署项目的 ...

  6. Git简明教程一、基本概念

    文本是写给新手的Git入门教程.本文的目的是让新手能够快速了解并开始使用Git,因此只会介绍最基本.同时也是最核心的知识.其中包括使用Git的基本步骤和Git中最常用的命令,以及如何使用GitHub托 ...

  7. 20165333 2016-2017-2 《Java程序设计》第1周学习总结

    20165333 2016-2017-2 <Java程序设计>第1周学习总结 教材学习内容总结 java 的地位 Java 的特点 安装JDK 系统环境的设置 Java程序的编写,编译和运 ...

  8. 聊一聊FE面试那些事【原创】

    最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者的经历一样,在面试的过 ...

  9. day5模块学习--shelve模块

    shelve模块 shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表.字典.或者用户自定义的 ...

  10. 关键字final和override

    final关键字 限制某个类或结构体不能被继承 直接对类声明: class A final{}; class B : public A {}; 或这类内有final函数,类可以被继承,但是final函 ...