LOJ.2587.[APIO2018]铁人两项Duathlon(圆方树)
2018-06-01 14:28
495 查看
题目链接 LOJ
洛谷P4630
先对这张图建圆方树。
对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和。
因为两方点之间的圆点会计算两次,所以圆点权值设为-1就好了。
那么现在有 \(n^2\) 个点对,求每个点对之间的路径上点的权值和。
对每个点计算一下被计算次数就可以了。这个路径次数计算注意考虑全。。
另外点对是圆点的,所以方点初始sz[]为0,圆点才是1。
方点其实建一条边就可以。
LOJ为什么找不到代码框的位置了。。交了两次文件CE了两次,是代码不能加注释?
好了 原来网页放大后代码框就没了。。
zz地调了半上午,做做月考卷冷静一下。先用1h做完英语。
洛谷P4630
先对这张图建圆方树。
对于S->T这条(些)路径,其对答案的贡献为可能经过的所有点数,那么我们把方点权值设为联通分量的大小,可以直接去求树上路径权值和。
因为两方点之间的圆点会计算两次,所以圆点权值设为-1就好了。
那么现在有 \(n^2\) 个点对,求每个点对之间的路径上点的权值和。
对每个点计算一下被计算次数就可以了。这个路径次数计算注意考虑全。。
另外点对是圆点的,所以方点初始sz[]为0,圆点才是1。
方点其实建一条边就可以。
LOJ为什么找不到代码框的位置了。。交了两次文件CE了两次,是代码不能加注释?
好了 原来网页放大后代码框就没了。。
zz地调了半上午,做做月考卷冷静一下。先用1h做完英语。
#include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar() const int N=100005<<1,M=4e5+7;//2N!→_→ int n,m,tot,sk ,top,dfn ,low ,Index,fa ,sz ,val ; long long Ans; struct Graph { int H ,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) { 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)//不一定连通!这个很mmp。 if(!dfn[i]) Tarjan(i), pre_DFS(i,i), Solve(i,i,sz[i]); printf("%lld",Ans); return 0; }
相关文章推荐
- [APIO2018]铁人两项(圆方树DP)
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
- 【APIO 2018】铁人两项(圆方树)
- LOJ2587:[APIO2018]铁人两项——题解
- [APIO2018] New Home 新家
- [APIO2018] Circle selection 选圆圈
- CTSC && APIO 2018划水记
- CTSC2018 && APIO2018 游记
- APIO 2018 游记
- [APIO2018]新家(线段树+堆)
- 【LOJ】#2587. 「APIO2018」铁人两项
- mobiquity Money获得GSMA GLOMO Awards 2018两项提名
- [APIO2018]选圆圈(KD-Tree)
- 2017-2018-1 20155315 《信息安全系统设计基础》实验三 实时系统
- 2018,全新出发(全力推动实现住有所居)
- # 2017-2018-1 20155224 《信息安全系系统设计基础》第四周MyOD
- ACM-ICPC 2018 焦作赛区网络预赛 I题 Save the Room
- 512 个 AI 职位、11 万美元年薪,盘点 2018 最佳人工智能公司
- 记2018全国大学生建模比赛
- 2017-2018 ACM-ICPC Southeast Regional Contest (Div. 1) F.Move Away 几何