P3565 [POI2014]HOT-Hotels
题目描述
There are nn towns in Byteotia, connected with only n-1n−1 roads.
Each road directly links two towns.
All the roads have the same length and are two way.
It is known that every town can be reached from every other town via a route consisting of one or more (direct-link) roads.
In other words, the road network forms a tree.
Byteasar, the king of Byteotia, wants three luxury hotels erected to attract tourists from all over the world.
The king desires that the hotels be in different towns and at the same distance one from each other.
Help the king out by writing a program that determines the number of possible locations of the hotel triplet in Byteotia.
输入输出格式
输入格式:
The first line of the standard input contains a single integer nn (1\le n\le 5\ 0001≤n≤5 000), the number of towns in Byteotia.
The towns are numbered from 11 to nn.
The Byteotian road network is then described in n-1n−1 lines.
Each line contains two integers aa and bb (1\le a\le b\le n1≤a≤b≤n) , separated by a single space, that indicate there is a direct road between the towns aa and bb.
输出格式:
The first and only line of the standard output should contain a single integer equal to the number of possible placements of the hotels.
输入输出样例
输入样例#1: 复制
7
1 2
5 7
2 5
2 3
5 6
4 5
输出样例#1: 复制
5
给定一棵树,求有多少三点间距离两两相等
\(asuldb\)怒嘲这道题和给定一棵树求有多少点一样简单
其实三个点间距离两两相等当且仅当这三个点到同一个点距离相等且路径不重合,
我们处理出到距离每个点每个距离的点的个数,然后排列组合
每次换根,那么三个点一等在不同子树,所有情况-三个点在同一子树情况-两个点在同一子树情况即可
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b))
using namespace std;
int dp[5011][5011],i,j,k,m,n,d[5011],ver[10011],nex[10011],head[10111],cnt,de[10011],x,y;
LL ans;
void add(int x,int y)
{
cnt+=1;
ver[cnt]=y; nex[cnt]=head[x]; head[x]=cnt;
}
void dfs1(int now,int fa,int f)
{
int r[10001];
for(int i=1;i<=f;i++) r[i]=d[i];
for(int i=1;i<=max(f,de[now]);i++)
{
if(d[i]>=3) ans-=(LL)d[i]*(d[i]-1)*(d[i]-2)/6;
dp[now][i]+=d[i];
if(dp[now][i]>=3) ans+=(LL)dp[now][i]*(dp[now][i]-1)*(dp[now][i]-2)/6;
}
for(int i=head[now];i;i=nex[i])
{
int t=ver[i];
if(t==fa) continue;
for(int j=1;j<=de[t];j++)
{
if(dp[t][j]>=3) ans-=(LL)dp[t][j]*(dp[t][j]-1)*(dp[t][j]-2)/6;
if(dp[now][j+1]>=3 && dp[t][j]>=2) ans-=(LL)dp[t][j]*(dp[t][j]-1)*(dp[now][j+1]-dp[t][j])/2;
}
}
for(int i=1;i<=max(f,de[now]);i++)
if(d[i]>=2 && dp[now][i]>=3) ans-=(LL)d[i]*(d[i]-1)*(dp[now][i]-d[i])/2;
for(int i=head[now];i;i=nex[i])
{
int t=ver[i];
int g=max(f+1,de[now]+1);
if(t==fa) continue;
for(int j=g;j>=2;j--)
d[j]=dp[now][j-1]-dp[t][j-2];
d[1]=1;
dfs1(t,now,g);
for(int j=1;j<=f;j++) d[j]=r[j];
}
}
void dfs(int now,int fa)
{
de[now]=1;
dp[now][0]=1;
for(int i=head[now];i;i=nex[i])
{
int t=ver[i];
if(t==fa) continue;
dfs(t,now);
de[now]=max(de[now],de[t]+1);
for(int j=0;j<=de[t];j++) dp[now][j+1]+=dp[t][j];
}
}
int main()
{
scanf("%d",&n);
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs(1,0);
dfs1(1,0,1);
printf("%lld",ans);
}
P3565 [POI2014]HOT-Hotels的更多相关文章
- luogu P3565 [POI2014]HOT-Hotels
传送门 无脑暴力+O2=AC 题目要统计距离两两相等的三个点的组数,这三个点之间显然有一个点,并且这三个点到这个点的距离都相同.所以枚举中间这个点作为根,然后bfs整棵树,对于每一层,把以根的某个儿子 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 2016 ICPC青岛站---k题 Finding Hotels(K-D树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over ...
- hdu-5992 Finding Hotels(kd-tree)
题目链接: Finding Hotels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/ ...
- BZOJ 3524: [Poi2014]Couriers [主席树]
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1892 Solved: 683[Submit][St ...
- BZOJ 3524: [Poi2014]Couriers
3524: [Poi2014]Couriers Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 1905 Solved: 691[Submit][St ...
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- 【BZOJ】【3522】【POI2014】Hotel
暴力/树形DP 要求在树上找出等距三点,求方案数,那么用类似Free Tour2那样的合并方法,可以写出: f[i][j]表示以 i 为根的子树中,距离 i 为 j 的点有多少个: g[i][j]表示 ...
- 【BZOJ】【3831】【POI2014】Little Bird
DP/单调队列优化 水题水题水题水题 单调队列优化的线性dp…… WA了8次QAQ,就因为我写队列是[l,r),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...
随机推荐
- MyBatis源码解析之数据源(含数据库连接池简析)
一.概述: 常见的数据源组件都实现了javax.sql.DataSource接口: MyBatis不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 一般情况下,数据源的初始化过程参数较多,比 ...
- hdu 1023 卡特兰数《 大数》java
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- MVC 导出Execl 的总结几种方式 (三)
第三种方式呢,就是借用第三方插件 NPOI 来实现Execl 导出 第一步:在NuGut包中下载NPOI 组件 第二步:编辑控制器代码 public FileResult ExcelNewKeyPro ...
- Laravel 多域名共享session
在网站开发中会涉及登陆的问题,在登陆的过程中为了方便用户体验,我们需要用户在主域名登陆,在其他域名下也要保持登陆状态: 在config/session.php中: 更新网站配置缓存即可
- opencv3.2.0形态学滤波之形态学梯度、顶帽、黑帽
/*一.形态学梯度 (1)含义:是膨胀图和腐蚀图之差 (2)数学表达式:dst=morph-grad(src,element) =dilate(src,element) - erode(src,ele ...
- 直接拿去用!每个App都会用到的LoadingLayout
前言 项目里都会遇到几种页面,分别为加载中.无网络.无数据.出错四种情况,经常要使用,所以封成库引用了,方便使用,顺便分享出来.先看一下效果: 原理比较简单,继承FrameLayout,在xml渲染完 ...
- canvas交互部分
mousemove let mouse = { x: undefined, y: undefined, } // 鼠标监听事件,获取鼠标移动的相应坐标 window.addEventListener( ...
- 解决initializing java tooling(1%)
这是wtp的一个bug,下载附件runtimePatch_327801.zip,解压,放到eclipse下,重启就好了.
- 关于nicescroll滚动条现在浏览器上滚动问题
nativeparentscrolling: false //检测内容底部,并让父节点来滚动,作为原生滚动 有时候 当自定义滚动条在底部 滚动无效 可以把这个参数设置一下
- linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘
linux或者OS X系统中,使用“dd”命令可以直接在终端命令行模式下,制作ISO镜像的系统安装盘. 一.linux系统以centOS7为例. sudo dd if=镜像路径 of=USB设备路径 ...