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),但是实际操作取队尾元素的时候忘记了……不怎么从队尾取元素嘛……平时都是直接往进放的……还 ...
随机推荐
- jeecg框架解决跨域问题
controller层方法体中添加如下代码 response.setHeader("Access-Control-Allow-Origin", "*");res ...
- 通过SourceTree连接SSL有问题的自建gitlab服务器
我用的是 SourceTree 作为Git客户端的,用它连接一个HTTPS证书过期的自建git服务,会收到下面错误: abort: error: _ssl.c:507: error:14090086: ...
- JSP学习笔记(1)-JSP简介
1.什么是JSP? JSP是Java server page的缩写,有sun公司倡导,许多公司参与,于1999年推出的一种web服务设计标准.JSP基于Java Servlet以及整个java体系的W ...
- Ubuntu使用心得
因为开发学习需要,也接触了一些Ubuntu系统,玩崩了两次系统之后,也学到了一些东西. -------------------------------------------------------- ...
- LeetCode SQL:Employees Earning More Than Their Managers
# Write your MySQL query statement below SELECT a.Name FROM Employee AS a INNER JOIN Employee AS b O ...
- ACK-Ackermann, 阿克曼函数
以前好几次在学语言的使用都有实现这个ack函数的经历,今天读本算法书,偶尔又提到了这个,查了下wiki来头好大 Values of A(m, n) m\n 0 1 2 3 4 n 0 1 2 3 4 ...
- 探讨ES6的import export default 和CommonJS的require module.exports
今天来扒一扒在node和ES6中的module,主要是为了区分node和ES6中的不同意义,避免概念上的混淆,同时也分享一下,自己在这个坑里获得的心得. 在ES6之前 模块的概念是在ES6发布之前就出 ...
- 初学JavaSE
Java简介 Java面向对象程序设计语言和Java平台的总称. Java常用术语介绍 JVM:java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class ...
- 拖拽进度条(SeekBar)
拖拽进度条(SeekBar) 监听方法:setOnSeekBarChangeListener 监听器:SeekBar.OnSeekBarChangeListener 简单,直接上代码: 1.Activ ...
- Ubuntu 安装uwsgi遇到的问题
apt-get install python-dev uwsgi安装: ubuntu安装uwsgi遇到的问题 Command "/root/myenv/bin/python3.4 -c &q ...