【Foreign】旅行路线 [倍增]
旅行路线
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】旅行路线 [倍增]的更多相关文章
- codevs 1036 商务旅行 (倍增LCA)
/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...
- GDOI2015小Z的旅行路线
GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...
- NOIP2001 Car的旅行路线
题四 Car的旅行路线(30分) 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- 洛谷 P1027 Car的旅行路线
P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...
- AC日记——Car的旅行路线 洛谷 P1027
Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...
- P1027 car的旅行路线
car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...
- 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...
随机推荐
- 形象的理解Strong和Weak
Strong Weak
- 指纹识别人脸识别 iOS
//1.判断iOS8及以后的版本 if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){ //从iPhone5S开始,出现指 ...
- c++ combination by next_permutation
#include <iostream> #include <algorithm> #include <vector> int main() { int n, r; ...
- 解析车辆VIN码识别(车架号识别)系统
很多人在购买车辆的时候,只关注性能.外观.内饰等,其实真正的内行是首先看车辆的VIN码,也叫车架号码. VIN码(车架号码)是一辆车的唯一身份证明,一般在车辆的挡风玻璃处,有的在车辆防火墙上,或B柱铭 ...
- 洛谷P1379八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中. 要求解的问题是:给出一种初始布局(初始状态)和目标布局(为 ...
- HDU 3698 Let the light guide us(DP+线段树)(2010 Asia Fuzhou Regional Contest)
Description Plain of despair was once an ancient battlefield where those brave spirits had rested in ...
- iOS-SDWebImage的原理以及使用流程
SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.SDWebImage加载图片的流程: 1. 入口 setImageWi ...
- 【Solr】——Solr7安装教程
前提 solr已经升级7.1,但是我们公司的solr还是使用的4.4,你们说low不low!!!重要的是,人家花费了大气将solr升级,从技术的角度来说solr7比solr4那是翻天覆地的改变! so ...
- jQuery添加、移除、改变class属性
jQuery中一般有3个关于改变元素class的函数addClass.removeClass.toggleClass addClass描述: 为每个匹配的元素添加指定的样式类名$('div').add ...
- [剑指Offer] 16.合并两个排序链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. [思路1]递归 /* struct ListNode { int val; struct Lis ...