luogu

题目描述

比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成。

最近,比特镇获得了一场铁人两项锦标赛的主办权。这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行车完成第二段赛程。

比赛的路线要按照如下方法规划:

\(1\)、先选择三个两两互不相同的路口 \(s, c\) 和 \(f\) ,分别作为比赛的起点、切换点(运动员在长跑到达这个点后,骑自行车前往终点)、终点。

\(2\)、选择一条从 \(s\) 出发,经过 \(c\) 最终到达 \(f\) 的路径。考虑到安全因素,选择的路径经过同一个点至多一次。

在规划路径之前,镇长想请你帮忙计算,总共有多少种不同的选取 \(s,c\) 和 \(f\) 的方案,使得在第 \(2\) 步中至少能设计出一条满足要求的路径。

sol

像我这种连圆方树都不会的菜鸡就活该\(APIO\)被卡线qaq。

把圆方树建出来,在树中任意枚举两个圆点作为 \(s\) 和 \(f\) ,然后考虑 \(c\) 有多少种选法。

应该是这两个点路径上的每个点双中的点都可以选吧。

令每个圆点的权值为\(-1\),每个方点的权值为点双大小,那么选法应该就是两点路径的权值和吧。

也就是说我们要求圆方树上\(n^2\)条圆点到圆点的路径的权值和。

很容易想到计算每个点被算了多少次。这样就可以在线性的时间内做完这题了。

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 4e5+5;
int n,tot,m,dfn[N],low[N],tim,S[N],val[N],sz[N],sum;
long long ans;
struct Graph{
int to[N],nxt[N],head[N],cnt;
void link(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
}G1,G2;
void Tarjan(int u){
dfn[u]=low[u]=++tim;S[++S[0]]=u;
sz[u]=1;val[u]=-1;
for (int e=G1.head[u];e;e=G1.nxt[e]){
int v=G1.to[e];
if (!dfn[v]){
Tarjan(v),low[u]=min(low[u],low[v]);
if (low[v]>=dfn[u]){
G2.link(u,++tot);val[tot]=1;int x=0;
do{
x=S[S[0]--];G2.link(tot,x);
sz[tot]+=sz[x];++val[tot];
}while (x!=v);
sz[u]+=sz[tot];
}
}
else low[u]=min(low[u],dfn[v]);
}
}
void dfs(int u){
if (u<=n) ans+=1ll*(sum-1)*val[u];
ans+=1ll*(sum-sz[u])*sz[u]*val[u];
for (int e=G2.head[u];e;e=G2.nxt[e]){
int v=G2.to[e];
ans+=1ll*(sum-sz[v])*sz[v]*val[u];
dfs(v);
}
}
int main(){
tot=n=gi();m=gi();
while (m--){
int u=gi(),v=gi();
G1.link(u,v);G1.link(v,u);
}
for (int i=1;i<=n;++i) if (!dfn[i]) Tarjan(i),sum=sz[i],dfs(i);
printf("%lld\n",ans);return 0;
}

[Luogu4630][APIO2018]Duathlon 铁人两项的更多相关文章

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

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

  2. P4630 [APIO2018] Duathlon 铁人两项

    思路 圆方树,一个点双中的所有点都可以被经过,所以给圆点赋值-1,方点赋值为圆点个数,统计圆点两两之间的路径权值和即可 代码 #include <cstdio> #include < ...

  3. [APIO2018] Duathlon 铁人两项

    不经过重点,考虑点双 点双,考虑圆方树 两个点s,t,中间路径上,所有点双里的点都可以经过,特别地,s,t作为割点的时候,不能往后走,也就是不能经过身后的方点 也就是,(s,t)经过树上路径上的所有圆 ...

  4. 【题解】APIO2018 Duathlon 铁人两项

    首先对于给出的图建立圆方树,然后我们分类讨论每一个点作为中间的中转站出现的情况有多少种,累积到 \(ans\) 中. 对于圆点:在任意两个子树内分别选出一个节点都是合法的. 对于方点:连接向方点的点均 ...

  5. luogu 4630 [APIO2018] Duathlon 铁人两项

    题目大意: 无向图上找三个点 a b c使存在一条从a到b经过c的路径 求取这三个点的方案数 思路: 建立圆方树 这个圆方树保证没有两个圆点相连或两个方点相连 对于每个节点x 设该节点为路径的中间节点 ...

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

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

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

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

  8. [洛谷P4630][APIO2018] Duathlon 铁人两项

    题目大意:给一张无向图,求三元组$(u,v,w)$满足$u->v->w$为简单路径,求个数 题解:圆方树,缩点后$DP$,因为同一个点双中的点一定地位相同 卡点:1.$father$数组开 ...

  9. 【APIO2018】铁人两项

    [APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...

随机推荐

  1. angular中的cookies与cookieStore区别

    设置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如设置一个cookie,名为 ...

  2. QtCreator的中如何使用第三方依赖库

    > https://blog.csdn.net/e5Max/article/details/9840331 ```LIBS += -L/usr/local/lib -lmath  ``` ``` ...

  3. 1029: [JSOI2007]建筑抢修 贪心

    https://www.lydsy.com/JudgeOnline/problem.php?id=1029 题意:n个建筑,每个有修复时间和爆炸时间,没有在爆炸时间内修复就会爆炸,问最多能修复的建筑 ...

  4. p-value值的认识

    待续:https://www.zhihu.com/question/21429785/answer/147047565

  5. 关系型数据库事务遵循ACID原则

    事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (Atomicity) 原子性 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功 ...

  6. linux---进程,(rpm,yum)软件包

      3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区,大小为5G fdisk -l fdisk /dev/sdb p 查看 n 新建    p  主分区 ...

  7. Java进阶2 数组内存和对象的内存管理知识

    Java进阶2 数组内存和对象的内存管理知识 20131028 前言: 在面试的时候,如果是Java的编程语言,也许你认为没有什么可以问的,只能够说明你对于Java了解的太浅了,几乎就是两个星期的节奏 ...

  8. bzoj1711

    题解: 原点->食物建一个1 食物->牛见一个1 牛->牛'见一个1 牛'->饮料1 饮料->汇点1 代码: #include<cstdio> #includ ...

  9. 公客网beta阶段发布说明

    项目 公客 公正客观的课程评价网站 功能说明 评价的增删改 对课程发表评价 限制评价次数(3次),删除与增量修改评价 评价下的讨论与点赞 在评价下添加讨论,支持在讨论中使用@与对方交流想法 为评价点赞 ...

  10. 【HTML5】HTML5 WebSocket简介以及简单示例

    互联网发展到现在,早已超越了原始的初衷,人类从来没有像现在这样依赖过他:也正是这种依赖,促进了互联网技术的飞速发展.而终端设备的创新与发展,更加速了互联网的进化: HTTP/1.1规范发布于1999年 ...