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,商人从首都出发,其他各城镇 ...
随机推荐
- sql里将重复行数据合并为一行,数据用逗号分隔
一.定义表变量 DECLARE @T1 table ( UserID int , UserName ), CityName ) ); ,'a','上海') ,'b','北京') ,'c','上海') ...
- net farmework 4安装不了 原因是 HRESULT 0xc8000222
1. Click Start, Run, type: cmd and press Enter. Please run the following command in the opened windo ...
- ARM Linux从Bootloader、kernel到filesystem启动流程
转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...
- SVN 分支及合并的介绍和实践---命令行
写在前面 一些相关的概念和原理 进行分支开发的最佳实践 合并的分类 在 Eclipse 中进行合并操作 相关资源 写在前面 本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念.流程和一些实际操作 ...
- 黄聪:HtmlAgilityPack,C#实用的HTML解析类简介
HtmlAgilityPack是.net下的一个HTML解析类库.支持用XPath来解析HTML.这个意义不小,为什么呢?因为对于页面上的元素的xpath某些强大的浏览器能够直接获取得到,并不需要手动 ...
- System.InvalidOperationException: Sequence contains no elements
foreach (var keyCode in unexpectedKeyCodesDetected) { string unexpected = expectedCapturedKeyCodes.W ...
- OAF_解决OAF与Windows版本不兼容黑屏
20150806 Created By BaoXinjian
- POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题
有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开 ...
- NeHe OpenGL教程 第一课:OpenGL窗口
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- ICANN认证企业列表
查询地址: http://www.internic.net/alpha.html