[APIO2018] Duathlon 铁人两项
不经过重点,考虑点双
点双,考虑圆方树
两个点s,t,中间路径上,所有点双里的点都可以经过,特别地,s,t作为割点的时候,不能往后走,也就是不能经过身后的方点
也就是,(s,t)经过树上路径上的所有圆点和方点
把方点权值设为点双大小-2,圆点权值设为1,(s,t)路径上的权值就是c的选择方案数(不算s,t自己权值)
问题转化为:求树上任意点对的距离和,(x,y),(y,x)算两次
在转化为考虑每个点的贡献,树形DP即可
注意:
1.可能不连通
2.sz统计的是圆点的个数
3.最后乘2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const int N=+;
const int M=+;
int n,m;
struct node{
int nxt,to;
}e[*M];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int dfn[N],df;
int low[N];
ll ans=;
int vis[N];
int val[N];
int typ[N];
vector<int>mem[N];
int num;
int sta[N],top;
void tarjan(int x){
typ[x]=;
val[x]=;
low[x]=dfn[x]=++df;
sta[++top]=x;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x]){
++num;
int z;
do{
z=sta[top];
mem[num].push_back(z);
--top;
}while(z!=y);
mem[num].push_back(x);
}
}else low[x]=min(low[x],dfn[y]);
}
}
int sz[*N];
int totsz=;
void fin(int x,int fa){
vis[x]=;
totsz+=typ[x];
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
fin(y,x);
}
}
void dfs(int x,int fa){
vis[x]=;
sz[x]=typ[x];
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa) continue;
dfs(y,x);
sz[x]+=sz[y];
}
ll tmp=totsz-sz[x];
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;;
if(y==fa) continue;
ans=ans+tmp*sz[y]*val[x];
tmp+=sz[y];
}
}
int main(){
rd(n);rd(m);
int x,y;
for(reg i=;i<=m;++i){
rd(x);rd(y);
add(x,y);add(y,x);
}
for(reg i=;i<=n;++i){
if(!dfn[i]) tarjan(i);
}
int tot=n;
memset(hd,,sizeof hd);
cnt=;
//cout<<" num "<<num<<endl;
for(reg i=;i<=num;++i){
++tot;
typ[tot]=;
val[tot]=mem[i].size()-;
//cout<<" tot "<<tot<<endl;
for(reg j=;j<(int)mem[i].size();++j){
//cout<<" mem "<<mem[i][j]<<endl;
add(tot,mem[i][j]);
add(mem[i][j],tot);
}
}
for(reg i=;i<=tot;++i){
if(!vis[i]){
totsz=;
fin(i,);
dfs(i,);
}
}
printf("%lld",ans*);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/2/15 9:04:01
*/
[APIO2018] Duathlon 铁人两项的更多相关文章
- [APIO2018] Duathlon 铁人两项 圆方树,DP
[APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...
- [Luogu4630][APIO2018]Duathlon 铁人两项
luogu 题目描述 比特镇的路网由 \(m\) 条双向道路连接的 \(n\) 个交叉路口组成. 最近,比特镇获得了一场铁人两项锦标赛的主办权.这场比赛共有两段赛程:选手先完成一段长跑赛程,然后骑自行 ...
- P4630 [APIO2018] Duathlon 铁人两项
思路 圆方树,一个点双中的所有点都可以被经过,所以给圆点赋值-1,方点赋值为圆点个数,统计圆点两两之间的路径权值和即可 代码 #include <cstdio> #include < ...
- 【题解】APIO2018 Duathlon 铁人两项
首先对于给出的图建立圆方树,然后我们分类讨论每一个点作为中间的中转站出现的情况有多少种,累积到 \(ans\) 中. 对于圆点:在任意两个子树内分别选出一个节点都是合法的. 对于方点:连接向方点的点均 ...
- luogu 4630 [APIO2018] Duathlon 铁人两项
题目大意: 无向图上找三个点 a b c使存在一条从a到b经过c的路径 求取这三个点的方案数 思路: 建立圆方树 这个圆方树保证没有两个圆点相连或两个方点相连 对于每个节点x 设该节点为路径的中间节点 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 (圆方树)
圆方树大致理解:将每个点双看做一个新建的点(方点),该点双内的所有点(圆点)都向新建的点连边,最后形成一棵树,可以给点赋予点权,用以解决相关路径问题. 在本题中,方点点权赋值为该点双的大小,因为两个点 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...
- [洛谷P4630][APIO2018] Duathlon 铁人两项
题目大意:给一张无向图,求三元组$(u,v,w)$满足$u->v->w$为简单路径,求个数 题解:圆方树,缩点后$DP$,因为同一个点双中的点一定地位相同 卡点:1.$father$数组开 ...
- 【APIO2018】铁人两项
[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...
随机推荐
- 20155218 《网络对抗技术》 MAL_恶意代码分析
20155218 <网络对抗技术> MAL_恶意代码分析 实验内容: 1.使用schtasks指令监控系统运行 1.在C盘下新建一个文本文档,输入一下内容后,更名为netstatlog.b ...
- 20155238 2016-2017-2 《JAVA程序设计》第十周学习总结
教材学习内容总结 # Java计算机网络基础 计算机网络 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使 ...
- 《网络对抗》Exp5 MSF基础应用
20155336<网络对抗>Exp5 MSF基础应用 一.基础知识回答 用自己的话解释什么是exploit,payload,encode exploit:渗透攻击的模块合集,将真正要负责攻 ...
- AngularJS+bootstrap-switch 实现开关控件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 老项目迁移到springboot之后,上线服务器出现404的解决方法
原因是老项目迁移到springboot之后,已经不再使用web.xml的配置了,但是WEB-INF目录下还有web.xml,所以才导致的404,所以只需要在源码处删除整个WEB-INF重新build即 ...
- 【Unity Shader】(三) ------ 光照模型原理及漫反射和高光反射的实现
[Unity Shader](三) ---------------- 光照模型原理及漫反射和高光反射的实现 [Unity Shader](四) ------ 纹理之法线纹理.单张纹理及遮罩纹理的实现 ...
- 一、Unity Editor自定义菜单
官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...
- React笔记-首次渲染
渲染机制 渲染机制主要分为两部分: 首次渲染和更新渲染. 首次渲染 首先通过一个小例子,来讲解首次渲染过程. <!DOCTYPE html> <html lang="en& ...
- PHPMyWind5.4存储XSS后续getshell提权
0x0 前言 通过留言处的xss,我们可以得到管理员的cookie,进而登陆后台: https://www.cnblogs.com/Rain99-/p/10701769.html 现在要从后台入手,进 ...
- PAT甲题题解-1058. A+B in Hogwarts (20)-大水题
无语,这种水题还出,浪费时间,但又不得不A... #include <iostream> #include <cstdio> #include <algorithm> ...