旅行路线

Time Limit: 20 Sec  Memory Limit: 256 MB

Description

  

Input

  

Output

  仅一行一个整数表示答案。

Sample Input

  3
  2 1
  3 1

Sample Output

  3

HINT

  

Main idea

  将每个点的入度作为标识,问从叶节点到根有几个本质不同的串。

Solution

  我们先考虑暴力的写法,显然无重复的话是答案是ΣDep[i],那么我们构建出一棵树,然后从任意两个点暴力往上判断找到最长相同的长度,然后减去这个长度即可。

  我们发现这个算法慢在哪里?就是一步步判断太慢了!对于这种问题,我们显然可以使用倍增。

  我们用字符串的哈希值来判断字符串是否相同,那么就记录一个hash[u][i]表示从u到往上跳(2^i)-1的哈希值,然后我们按照每个点到根的哈希值排序,显然得到的序列会满足:哈希值有相同的必然会在一起,若相同的长则会更接近。

  然后我们O(n)比较相邻两个的哈希值,用倍增来跳,找到最长长度减去即可。

Code

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64;
const int ONE = ;
const int INF = ;
const int P = ; int n;
int x,y;
int Input[ONE];
int Dep[ONE],id[ONE];
int f[ONE][];
s64 Q[ONE],hash[ONE][];
int next[ONE],first[ONE],go[ONE],tot;
s64 Ans; int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int Add(int u,int v)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v;
} void Dfs(int u)
{
hash[u][] = Input[u]; for(int i=;i<=P-;i++)
{
f[u][i+] = f[f[u][i]][i];
hash[u][i+] = hash[u][i] + hash[f[u][i]][i] * Q[i];
} for(int e=first[u];e;e=next[e])
{
int v=go[e];
f[v][] = u;
Dep[v] = Dep[u] + ;
Dfs(v);
}
} bool cmp(int x,int y)
{
for(int i=P-;i>=;i--)
if(Dep[x]>=(<<i) && hash[x][i] == hash[y][i])
{
x = f[x][i];
y = f[y][i];
}
return hash[x][] < hash[y][];
} int Same(int x,int y)
{
int res=;
for(int i=P-;i>=;i--)
if(Dep[x]>=(<<i) && hash[x][i] == hash[y][i])
{
x = f[x][i];
y = f[y][i];
res += (<<i);
}
return res;
} int main()
{
n=get();
for(int i=;i<=n;i++) id[i]=i;
for(int i=;i<n;i++)
{
x=get(); y=get();
Add(y,x);
Input[x]++; Input[y]++;
} Q[] = 1e9+;
for(int i=;i<=P;i++) Q[i] = Q[i-] * Q[i-]; Dep[]=; Dfs();
sort(id+,id+n+,cmp); Ans = Dep[id[]];
for(int i=;i<=n;i++)
{
Ans += Dep[id[i]] - Same(id[i],id[i-]);
} printf("%lld",Ans);
}

【Foreign】旅行路线 [倍增]的更多相关文章

  1. codevs 1036 商务旅行 (倍增LCA)

    /* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...

  2. GDOI2015小Z的旅行路线

    GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...

  3. NOIP2001 Car的旅行路线

    题四 Car的旅行路线(30分) 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  4. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)

    最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...

  5. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  6. 洛谷 P1027 Car的旅行路线

    P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...

  7. AC日记——Car的旅行路线 洛谷 P1027

    Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...

  8. P1027 car的旅行路线

    car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...

  9. 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...

随机推荐

  1. 今天领导分享了一个探测端口的命令-linux下提示bash:command not found

    今天领导分享了一个探测端口的命令,于是试了一下,提示未找到-bash: nc: command not found  因此决定将bash的命令在复习一下,温故而知新 总结整理于此: 确定你的DNS可以 ...

  2. Java的HashMap和HashTable

    Java的HashMap和HashTable 1. HashMap 1)  hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashm ...

  3. python 字典(dict)按键和值排序

    python 字典(dict)的特点就是无序的,按照键(key)来提取相应值(value),如果我们需要字典按值排序的话,那可以用下面的方法来进行: 1 下面的是按照value的值从大到小的顺序来排序 ...

  4. ProxySQL读写分离测试(续)

      Preface       I've implemented ProxySQL on PXC yesterday but got some errors when configured query ...

  5. 2015年开源前端框架盘点TOP20

    2015年,榜单根据github上star数作为排名依据.(榜单中大部分为组件式框架, react.Angular等基础框架不在此篇讨论) 1.Bootstrap 类别/语言:HTML.CSS.Jav ...

  6. C语言运算符(注意事项)

    1.C语言取余注意事项:%   a.求余.模运算符(%)时要求两数必须是整型数据. b.取余的结果,是取决于被除数   (不管除数是正数 还是 负数,模的符号与被除数的符号相同).   例:8÷2=4 ...

  7. TensorFlow 同时调用多个预训练好的模型

    在某些任务中,我们需要针对不同的情况训练多个不同的神经网络模型,这时候,在测试阶段,我们就需要调用多个预训练好的模型分别来进行预测. 调用单个预训练好的模型请点击此处 弄明白了如何调用单个模型,其实调 ...

  8. nohup追加日志

    背景:用脚本部署Spring Boot应用,用nohup命令进行后台运行 之前的日志处理: nohup command > myout.file 2>&1 & 导致每次用s ...

  9. PHP Warning: File upload error - unable to create a temporary file in Unknown on line 0

    代码在本地运行一切都OK,放到服务器上,网站访问正常,上传就出现该错误. 提示:PHP Warning: File upload error - unable to create a temporar ...

  10. struts2中的action为什么要继承ActionSupport类,不继承也可以,有什么好处?

    简单来说,有很多相关的方法都加载进来,你直接调用就行了,而且在安全上和稳定性上做了很好的处理 实际上继承ActionSupport之后 就等同于实现了很多接口 Action,Validateable, ...