CODEVS 1036 商务旅行
某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间。
假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意两个城镇之间如果有直连道路,在他们之间行驶需要花费单位时间。该国公路网络发达,从首都出发能到达任意一个城镇,并且公路网络不会存在环。
你的任务是帮助该商人计算一下他的最短旅行时间。
输入文件中的第一行有一个整数N,1<=n<=30 000,为城镇的数目。下面N-1行,每行由两个整数a 和b (1<=a, b<=n; a<>b)组成,表示城镇a和城镇b有公路连接。在第N+1行为一个整数M,下面的M行,每行有该商人需要顺次经过的各城镇编号。
在输出文件中输出该商人旅行的最短时间。
LCA问题,可以转化为RMQ问题
dep[]表示节点在树中的深度
F是欧拉序列,B是欧拉序列节点对应的深度
pos[]表示节点第一次在欧拉序列中出现的位置
LCA(T,u,v)=F[RMQ(B,pos[u],pos[v])]
这里RMQ要返回坐标,而不是具体值,但本题不需要,本题只要得到LCA的深度即可,直接让RMQ返回具体值即可,所求深度就是这个返回值
最小值也可以用线段树维护
#include<iostream>
#include<cstring>
using namespace std;
;
struct node{
int l,r,mmin;
}tree[*maxn];
struct edge{
int go,next;
}e[*maxn];
,count=,F[*maxn],B[*maxn],M,pos[maxn],v[maxn];
void add(int a,int b){
e[++ecount].go=b;
e[ecount].next=end[a];
end[a]=ecount;
}
void buildTree(int f,int x,int d){
int go;
dep[x]=d;
F[++count]=x;
B[count]=d;
if(!v[x]){
pos[x]=count;v[x]=;
}
for(int i=end[x];i;i=e[i].next){
go=e[i].go;
if(go!=f){
buildTree(x,go,d+);
F[++count]=x;
B[count]=d;
}
}
}
void init()
{
memset(end,,sizeof(end));
memset(v,,sizeof(v));
}
void build(int o,int l,int r){
if(l==r){
tree[o].l=tree[o].r=l;
tree[o].mmin=B[l];
return;
}
;
build(*o,l,m);build(*o+,m+,r);
tree[o].l=l,tree[o].r=r;
tree[o].mmin=min(tree[o*].mmin,tree[o*+].mmin);
}
int query(int o,int l,int r){
if(l<=tree[o].l&&tree[o].r<=r) return tree[o].mmin;
;
<<;
*o,l,r));
*o+,l,r));
return ans;
}
int main()
{
cin>>N;
init();
int x,y;
;i<=N;i++){
cin>>x>>y;
add(x,y),add(y,x);
}
buildTree(-,,);
build(,,count);
//for(int i=1;i<=count;i++) cout<<i<<"F:"<<F[i]<<endl;
cin>>M;
,to;
cin>>last;
;i<M;i++){
cin>>to;
ans+=dep[last]+dep[to]-*B[query(,min(pos[last],pos[to]),max(pos[last],pos[to]))];
last=to;
}
cout<<ans;
;
}
CODEVS 1036 商务旅行的更多相关文章
- 倍增法-lca codevs 1036 商务旅行
codevs 1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某首都城市的商人要经常到各城镇去做生意 ...
- CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )
CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...
- codevs——1036 商务旅行
1036 商务旅行 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 某首都城市的商人要经常 ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- codevs 1036 商务旅行 (倍增LCA)
/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include<iostream> #include<cstdio> #include<cs ...
- 【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行
树链剖分求lca模板.O(log(n)),就是不倍增嘛~ #include<cstdio> #include<algorithm> using namespace std; # ...
- 【最近公共祖先】【块状树】CODEVS 1036 商务旅行
在线块状树LCA模板. #include<cstdio> #include<vector> #include<algorithm> #include<cmat ...
- CODEVS——T 1036 商务旅行
http://codevs.cn/problem/1036/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Descript ...
- C++之路进阶——codevs1036(商务旅行)
1036 商务旅行 题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇 ...
随机推荐
- VisualSVN Server以及TortoiseSVN客户端的配置和使用方法
http://www.cnblogs.com/beautifulFuture/archive/2014/07/01/3818211.html 近期学习代码管理工具,首先学习一下svn和Tortoise ...
- Chrome安装FlashPlayer Debug
首先: 在谷歌浏览器上打开chrome://plugins 找到 Adobe Flash Player 然后将谷歌自带的版本停用,如果已经安装了for Netscape版,则会显示另外一个版本.(建议 ...
- ADF_General JSF系列1_创建一个简单的JSF Application
2015-02-17 Creatd By BaoXinjian
- PLSQL_性能优化系列10_Oracle Array数据组优化
2014-09-25 Created By BaoXinjian
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
- cf111D Petya and Coloring 组合数学,二项式反演
http://codeforces.com/contest/111/problem/D Little Petya loves counting. He wants to count the numbe ...
- Linux命令(20)linux服务器之间复制文件和目录
linux的scp命令: scp就是secure copy的简写,用于在linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 有时我们需要获得远程服务器上 ...
- Linq常用操作
http://www.cnblogs.com/knowledgesea/p/3897665.html
- centos下yum安装wget失败
执行了yum -y install wget后得到下面的提示 Failed to set locale, defaulting to C Loaded plugins: fastestmirror L ...
- iOS设计模式反思之单例模式的进化
什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要调用相关的函数也得经过它.学术一点就是,单例模式,为某一类 需求和数据提供了统一的程序接口.主要 ...