2019CSUST集训队选拔赛题解(二)
凛冬将至
Description
维斯特洛大陆的原住民是森林之子,他们长得如孩童一般,善于使用石器,威力值35,用树叶树枝作为衣物,在森林里繁衍生息,与万物和平相处。他们会使用古老的魔法(比如绿之视野),威力值55。后来先民从维斯特洛大陆架登陆,凭借手中的青铜兵器和战马大举入侵,威力值分别是35和55。森林之子凭借魔法顽强抵抗,并冒险利用龙晶制造出了一个神奇的强悍的物种——异鬼,威力值60。双方持久不下之时签订了和平协议,先民占据了维斯特洛大陆,森林之子只保有森林。
七大王国如火如荼兴起之时,在遥远海洋的另一端,一个神秘的家族悄然兴起——坦格利安家族。此家族拥有三条巨龙,威力值90+,经过一个世纪的备战,在领导者伊耿一世的带领下乘龙入侵维斯特洛大陆。
借助龙的力量,伊耿一世很快统一了维斯特洛的七大王国,建立了空前强大的坦格利安王朝,像所有外来入侵者一样,坦格利安家族摒弃了龙的信仰开始信仰七神,并且将龙由放养改为圈养,再加上坦格利安家族为了保持血统纯正,实行近亲婚姻,生出来的继承者精神病人越来越多,这导让坦格利安王朝开始了眼花缭乱的花样作死之旅。
众(wo)所(xia)周(che)知(de),当凯特琳·徒利得知自己女儿艾莉亚逃到赫伦堡后,非常担心女儿的安全。假设维斯特洛大陆共有n个城市,共有n−1条双向道路把这n个城市连接起来。也就是说这是一棵树。凯特琳想尽快临冬城赶到赫伦堡。除了已知的n-1条边外,凯特琳还知道一条额外的秘密路径(也是双向的):端点是是城市x和城市y,路径长度是z。现在想考考寒假过后的你有没有刷过题,问你Q个问题,每个问题给出临冬城(凯特琳所在城市)和赫伦堡(艾莉亚所在城市)的坐标,请你告诉凯特琳从临冬城到赫伦堡的最短路径长度是多少?
Input
第一行一个整数n(1≤n≤100000)。
以下n−1行描述一颗树,每行u,v,w表示一条从u到v长为w的路径,u!=v。
下一行三个整数x,y,z,意义如题(1≤x,y≤n,x!=y)。
下一行一个整数Q(100000)。
以下Q行两个数字U,V代表临冬城和赫伦堡的坐标。
1≤w,z≤10000
Output
对每次询问输出从临冬城到赫伦堡的最短路径长度。
题目中所描述的是一颗树
这里再提一下树的特点:
①每个点都联通
②不含圈
③n阶树有n-1条边
PS:特别的是,具备以上任何两个特点可推出第三个
要注意求树上两点的距离不能用最短路算法,一般用LCA(只会这个
该题在树的基础上另加了一条边 只需要分情况讨论这条边对原有树的影响即可
故该题解法:裸LCA+分类讨论
ACODE:
//
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<string>
#include<queue>
#include<utility>
#include<vector>
#define lson l , m , rt << 1
#define rson m+1 , r , rt << 1 | 1
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double pi = 3.1415926535;
const double eps = 1e-;
const int MX = 1e5 + ;
const int maxbit = ;
const double val = pi/180.0;
const int INF = 0x3f3f3f3f;
struct edge
{
int to;
int val;
};
int father[MX][maxbit];
int depth[MX];
int dis[MX];
int lg[MX];
vector<edge> G[MX];
void dfs(int nowp,int fa)
{
depth[nowp] = depth[fa] + ;
father[nowp][] = fa;
for(int j = ;j <= lg[depth[nowp]] + ;++j)
{
father[nowp][j] = father[father[nowp][j-]][j-];
}
for(int i = ;i < G[nowp].size();++i)
{
edge e = G[nowp][i];
if(e.to != fa)
{
dis[e.to] = dis[nowp] + e.val;
dfs(e.to,nowp);
}
}
}
int lca (int u,int v)
{
if(depth[u] < depth[v]) swap(u,v);
while(depth[u] != depth[v])
u = father[u][lg[depth[u] - depth[v]]];
if(u == v) return u;
for(int j = lg[depth[u]];j >= ;--j)
{
if(father[u][j] != father[v][j]){
u = father[u][j];
v = father[v][j];
}
}
return father[u][];
}
//对大常数的优化
void init()
{
lg[] = -;
for(int i = ;i < MX;++i) lg[i] = lg[i >> ] + ;
}
int main(int argc, char const *argv[])
{
int n;
int u,v,w;
init();//记得初始化
scanf("%d",&n);
for(int i = ;i <= n-;++i)
{
scanf("%d%d%d",&u,&v,&w);
//邻接表建图
G[u].push_back({v,w});
G[v].push_back({u,w});
}
dfs(,);
scanf("%d%d%d",&u,&v,&w);
int m;
scanf("%d",&m);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
//三种情况
int p = lca(x,y);
int ans = (dis[x] - dis[p]) + (dis[y] - dis[p]); int p1 = lca(x,u);
int p2 = lca(y,v);
int alt1 = (dis[x] - dis[p1]) + (dis[u] - dis[p1]);
int alt2 = (dis[y] - dis[p2]) + (dis[v] - dis[p2]);
ans = min(ans,alt1 + alt2 + w); p1 = lca(x,v);
p2 = lca(y,u);
alt1 = (dis[x] - dis[p1]) + (dis[v] - dis[p1]);
alt2 = (dis[y] - dis[p2]) + (dis[u] - dis[p2]);
ans = min(ans,alt1 + alt2 + w); printf("%d\n",ans);
}
return ;
}
以后千万不能带个错误的LCA板子了
2019CSUST集训队选拔赛题解(二)的更多相关文章
- 2019CSUST集训队选拔赛题解(三)
PY学长的放毒题 Description 下面开始PY的香港之行,PY有n个要去的小吃店,这n个小吃店被m条路径联通起来. PY有1个传送石和n−1个传送石碎片. PY可以用传送石标记一个小吃店作为根 ...
- 2019CSUST集训队选拔赛题解(一)
来自ppq的毒瘤线段树 Sneakers Description 有一天喜欢买鞋的ppq和小伙伴来到了某一家球鞋店,球鞋店有n种球鞋,价格分别为ai,ppq在鞋店兜兜转转,发现鞋店老板会偶尔将某段 ...
- CSUST 集训队选拔赛题解
选拔赛的题解,~~~ 题目链接:请点击 A题 素数筛 + 线段树(树状数组) 先用素数筛打表,然后线段树更新,遍历求出值,O(1)查询即可 AC代码: /*num数组 是把记录 数是否存在 存在即为1 ...
- UVA题解二
UVA题解二 UVA 110 题目描述:输出一个Pascal程序,该程序能读入不多于\(8\)个数,并输出从小到大排好序后的数.注意:该程序只能用读入语句,输出语句,if语句. solution 模仿 ...
- URAL题解二
URAL题解二 URAL 1082 题目描述:输出程序的输入数据,使得程序输出"Beutiful Vasilisa" solution 一开始只看程序的核心部分,发现是求快排的比较 ...
- 2015苏州大学ACM-ICPC集训队选拔赛(3)题解
第三次校赛链接:快戳我 1001 考虑前半组数,我们只需要标记每个数出现的次数,再加上这个数之前的数出现的次数,即为这个数在m次操作中总共需要翻转的次数(即求前缀和),再根据翻转的奇偶性判断最后这个位 ...
- 江西理工大学南昌校区acm选拔赛题解
第一题略 第二题 #include<stdio.h> int main() { int a1,a2,a3,b1,b3,b2,c1,c2,c3,n,sum,d1,d2,d3,i; scanf ...
- CSUST选拔赛题解
本鶸鸡于本月10号参加了蔽校的选拔赛,成绩差的死,大部分的题都是赛后花了好长时间才补出来的,其中有些题还是靠QAQorz大佬帮忙才能解决,感谢Qls对我的帮助~接下来就附带上我的暴力题解,大佬们有更好 ...
- ypACM社团年终赛暨实验室选拔赛题解
记得补题,题目两小时半还是挺困难ak的,毕竟我验题也验了几天的时间,题目基本没有锅.题目基本属于简单题 我的三道题都是很基本的题目,希望大家补题 这些题解都是我写的,如果有疑问可以qq问我 所有的核心 ...
随机推荐
- 【洛谷】【动态规划/背包】P1417 烹调方案
由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的食物准备填 ...
- java web开发环境配置系列(一)安装JDK
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<java web开发环境配置系列>来祭奠那逝去的…… 1.下载JDK文件(http://www.or ...
- webbench安装和简单使用
一.安装流程 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar ...
- 访问 IIS 元数据库失败解决问题的方法
近日调试一Asp.net程序,出现了“访问 IIS 元数据库失败”的错误信息,最后经过搜索发现了解决问题的方法. 解决方法如下: 1.依次点击“开始”-“运行”. 2.在“运行”栏内输入 “C:\WI ...
- 简单部署iRedMail-0.9.8 - 邮件服务器架构和错误代码
1.去官网下载最新稳定版软件 https://www.iredmail.com/index.html 2.https://docs.iredmail.org/install.iredmail.on.r ...
- OO学习体会与阶段总结(多线程程序)
前言 在最近一个月的面向对象编程学习中,我们进入了编写多线程程序的阶段.线程的创建.调度和信息传递,共享对象的处理,线程安全类的编写,各种有关于线程的操作在一定程度上增加了近三次作业的复杂度与难度,带 ...
- Linux服务-mysql基础篇
目录 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 1.3 关系型数据库的常见组件 1.4 SQL语句 2. mysql安装与配置 2.1 mysql安装 2.2 mysq ...
- 追溯了解Ubuntu(壹)
1.关于Ubuntu 安装完成后界面展示 Ubuntu 是一个南非的民族观念,着眼于人们之间的忠诚和联系.该词来自于祖鲁语和科萨语.Ubuntu(发音"oo-BOON-too"-- ...
- 第五周加分题--mybash的实现
第五周加分题--mybash的实现 题目要求 1.使用fork,exec,wait实现mybash 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) ...
- python+soket实现UDP协议的客户/服务端中文聊天程序
没什么特别的东西,网上烂大街的C/S框架.(基于windows 7 + python 3.4) 为了实现中文聊天,我加入了一点修改: msg.encode('utf-8') # msg 为输入(且将要 ...