ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[APIO2018] Duathlon 铁人两项

2019-03-16 14:50:22  阅读:297  来源: 互联网

标签:APIO2018 ch Duathlon 点权 long 三元组 圆方树 铁人 define


传送门

Description

给出一张无向图,询问有多少个三元组\(<s,c,f>\)满足有一条简单路径从\(s\)出发,经过\(f\),可以到达\(c\)

Solution

圆方树裸题。

建出原图的圆方树。圆点的点权为\(-1\),方点的点权为双联通分量的大小,那么形如\(<x,y,f>\)的三元组数量应为\(x,y\)再圆方树上路径的点权和

我们转而考虑每个点的贡献,可以通过很简单的树形dp求得


Code 

//2019/3/8 15:44~16:51
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x*f;
}
const int MN=1e5+5,ME=4e5+5;
struct edge{int to,nex;}e[ME],E[ME];int en,hr[MN],En,Hr[MN<<1];
inline void ins(int f,int t,int &end,int *h,edge *Ed)
{
    Ed[++end]=(edge){t,h[f]};h[f]=end;
    Ed[++end]=(edge){f,h[t]};h[t]=end;
}
int N,M,dfn[MN],low[MN],st[MN],tp,dind,siz[MN<<1],val[MN<<1],num;
void tarjan(int x)
{
    dfn[x]=low[x]=++dind;st[tp++]=x;register int i;
    for(i=hr[x];i;i=e[i].nex)
    {
        if(!dfn[e[i].to])
        {
            tarjan(e[i].to);low[x]=min(low[x],low[e[i].to]);
            if(low[e[i].to]==dfn[x])
                for(val[++num]=1,Hr[num]=0,ins(num,x,En,Hr,E);st[tp]!=e[i].to;--tp)val[num]++,ins(num,st[tp-1],En,Hr,E);
        }
        else low[x]=min(low[x],dfn[e[i].to]);
    }
}
ll ans;
inline void dfs(int x,int f=0)
{
    register int i;siz[x]=x<=N;
    for(i=Hr[x];i;i=E[i].nex)if(E[i].to^f)
    {
        dfs(E[i].to,x);ans+=2ll*siz[x]*siz[E[i].to]*(ll)val[x];
        siz[x]+=siz[E[i].to];
    }
    ans+=2ll*siz[x]*(dind-siz[x])*(ll)val[x];
}
int main()
{
    num=N=read(),M=read();
    register int i;
    while(M--) i=read(),ins(i,read(),en,hr,e);
    for(i=1;i<=N;++i)val[i]=-1;
    for(i=1;i<=N;++i)if(!dfn[i])
    {num=N,dind=En=tp=0,tarjan(i),dfs(i);}
    return 0*printf("%lld\n",ans);
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

标签:APIO2018,ch,Duathlon,点权,long,三元组,圆方树,铁人,define
来源: https://www.cnblogs.com/PaperCloud/p/apio2018_Duathlon.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有