牧场行走(LCA)
好吧,这题很有意思。。
第一眼撇的时候还以为是(SPFA)呜。。。。
然后发现要Q次询问就想到了LCA
但是发现不是求LCA。。
于是想到了一个神奇的定律:
两点的LCA一定在u到v的最短路上。。
并且也一定在两点与根节点的路上。
所以用dis[a]+dis[b]-2*dis[LCA(a,b)]就得到答案啦!
这道题有一个坑点!注意!
我们先来看一个测试:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int x,y;
scanf("%d%d",&x,&y);
int k1=(int)(log(y-x+1.0)/log(2.0));
int k2=;
while(<<(k2+)<=y-x+)k2++;
printf("%d %d",k1,k2);
}
这看起来是等价的。。但是。。
输入:1 8
输出:2 3
恩,你没有看错,就是2、3.
事实是这样的:C++ 计算log(8)/log(2)时,得到的答案为(double)2.9999996。
强制转换为int后,变成了2;
但是这样就可以了QAQ
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int num;
int num2;
double k=log(8.0)/log(2.0);
num2=k;
printf("%d",num2);
}
恩,这样就是啦awa
万恶的C++。。。
下面贴代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
struct data{
int to,next,value;
}g[];
int head[];
bool qs[];
int id[];
int vs[];
int depth[];
int dp[][];
int dd[];
int dfs_clock=;
int n,q,num=,root;
void ins(int a,int b,int v){
g[++num].next=head[a];
head[a]=num;
g[num].to=b;
g[num].value=v;
}
void dfs(int u,int fa,int d){
id[u]=dfs_clock;
vs[dfs_clock]=u;
depth[dfs_clock++]=d;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(v==fa) continue;
dd[v]=dd[u]+g[i].value;
dfs(v,u,d+);
vs[dfs_clock]=u;
depth[dfs_clock++]=d;
}
}
void RMQ(int nn){
for(int i=;i<=nn;i++)
dp[i][]=i;
for(int j=;(<<j)<=nn;j++)
for(int i=;i+(<<j)-<=nn;i++)
{
int a=dp[i][j-];
int b=dp[i+(<<(j-))][j-];
if(depth[a]<=depth[b])
dp[i][j]=a;
else
dp[i][j]=b;
}
}
int cal(int x,int y){
double k2=log(y-x+1.0)/log(2.0);
int k=k2;
int a=dp[x][k];
int b=dp[y-(<<k)+][k];
if(depth[a]<=depth[b])
return a;
else return b;
}
int lca(int u,int v){
int x=id[u];
int y=id[v];
if(x<y)
return vs[cal(x,y)];
else return vs[cal(y,x)];
}
int main(){
scanf("%d%d",&n,&q);
for(int i=;i<n;i++)
{
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
qs[b]=;
ins(a,b,v);ins(b,a,v);
}
dfs(,,);
RMQ(dfs_clock-);
for(int i=;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",dd[a]+dd[b]-*dd[lca(a,b)]);
}
}
不会RMQ的可以看我的传送门
当然,要打树上倍增的也是可以啦。。
代码就不贴了。
真是奇特的题目233~
牧场行走(LCA)的更多相关文章
- [BZOJ1602] [Usaco2008 Oct] 牧场行走 (LCA)
Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走, ...
- bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)
1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 379 Solved: 216[Submit][Sta ...
- 树讲解——牧场行走( lca )
大视野 1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1947 Solved: 1021[Sub ...
- BZOJ1602: [Usaco2008 Oct]牧场行走
1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1084 Solved: 556[Submit][St ...
- BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )
一棵树..或许用LCA比较好吧...但是我懒...写了个dijkstra也过了.. ---------------------------------------------------------- ...
- 1602: [Usaco2008 Oct]牧场行走
1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1211 Solved: 616 [Submit][ ...
- 【bzoj1602】[Usaco2008 Oct]牧场行走
1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1793 Solved: 935[Submit][St ...
- 【BZOJ】1602: [Usaco2008 Oct]牧场行走(lca)
http://www.lydsy.com/JudgeOnline/problem.php?id=1602 一开始以为直接暴力最短路,但是n<=1000, q<=1000可能会tle. 显然 ...
- LCA || BZOJ 1602: [Usaco2008 Oct]牧场行走 || Luogu P2912 [USACO08OCT]牧场散步Pasture Walking
题面:[USACO08OCT]牧场散步Pasture Walking 题解:LCA模版题 代码: #include<cstdio> #include<cstring> #inc ...
随机推荐
- strak组件(6):列表定制列应用和引入静态文件
效果图: 新增函数 def get_choice_text(title, field) 闭包函数,显示choice字段 def inner(self, obj=None, is_header=None ...
- Hacker Cups and Balls Gym - 101234A 二分+线段树
题目:题目链接 题意:有编号从1到n的n个球和n个杯子. 每一个杯子里有一个球, 进行m次排序操作,每次操作给出l,r. 如果l<r,将[l,r]范围内的球按升序排序, 否则降序排, 问中间位置 ...
- SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。
可以查看到pycharm右下角文件的编码方式, 如果编码方式不一致,则在设置中修改编码方式: http://jingyan.baidu.com/article/c843ea0ba55f0977931e ...
- Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一.在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁.为了达到这个目的,开发者 ...
- 网络编程介绍(uninx/windows)
1.网络中进程之间如何通信? 2.Socket是什么? 3.socket的基本操作 3.1.socket()函数 3.2.bind()函数 3.3.listen().connect()函数 3.4.a ...
- The Django Book
The Django Book Table of contents 2.0, English -> Chinese Django book 2.0 的中文翻译. 最近更新 - 贡献者 方便自己也 ...
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- USACO Section2.3 Zero Sum 解题报告 【icedream61】
zerosum解题报告----------------------------------------------------------------------------------------- ...
- CocosCreator设置启动场景
刚开始接触CocosCreator,在调试时,如果有多个场景,不知道如何设置将某个指定的场景设置为启动场景,折腾了一圈,找到了设置的地方, 记录一下. 点击项目->项目设置 在预览运 ...
- PL/SQL 循环语句
1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...