直接点权下放到边权,每次查询从dfs序的st[u]+1,ed[v]之间查询,

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxx = 2e5+;
const int INF = 2e9;
struct node{
int l,r;
int w;
}tree[maxx<<];
int head[maxx],edge[maxx],Next[maxx],ver[maxx],dis[maxx];
int a[maxx],siz[maxx],top[maxx],son[maxx],d[maxx],fa[maxx],id[maxx],rk[maxx];
int p[maxx],pw[maxx],dfn[maxx];
int n,m,tot,uu,vv,cnt,q;
void add(int x,int y,int w){
ver[++tot]=y;edge[tot]=w;Next[tot]=head[x];head[x]=tot;
ver[++tot]=x;edge[tot]=w;Next[tot]=head[y];head[y]=tot;
}
void dfs1(int u,int f,int depth)
{
d[u]=depth;
fa[u]=f;
siz[u]=;
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (v==f)continue;
dis[v]=edge[i];
dfs1(v,u,depth+);
siz[u]+=siz[v];
if (siz[v]>siz[son[u]])
son[u]=v;
}
}
void dfs2(int u,int t)
{
top[u]=t;
id[u]=++cnt;
dfn[cnt]=u;
if (!son[u])
return ;
dfs2(son[u],t);
for (int i=head[u];i;i=Next[i])
{
int v=ver[i];
if (v!=son[u] && v!=fa[u])
dfs2(v,v);
}
}
void buildtree(int rt,int l,int r){
tree[rt].l=l;
tree[rt].r=r;
if (l==r){
tree[rt].w=dis[dfn[l]];
return ;
}
int mid=(l+r)>>;
buildtree(lson,l,mid);
buildtree(rson,mid+,r);
tree[rt].w=min(tree[lson].w,tree[rson].w);
}
int query(int rt,int ql,int qr){
if (ql>qr)return INF;
int l=tree[rt].l;
int r=tree[rt].r;
if (ql<=l && r<=qr){
return tree[rt].w;
}
int mid=(l+r)>>;
if (qr<=mid){
return query(lson,ql,qr);
}else if (ql>mid){
return query(rson,ql,qr);
}else {
return min(query(lson,ql,qr),query(rson,ql,qr));
}
}
int qRange(int x,int y){
int ans=INF;
while(top[x]!=top[y]){
if (d[top[x]]<d[top[y]])swap(x,y);
ans=min(ans,query(,id[top[x]],id[x]));
x=fa[top[x]];
}
if (d[x]>d[y])swap(x,y);
ans=min(ans,query(,id[x]+,id[y]));
return ans;
}
int main(){
int st;
while(~scanf("%d%d",&n,&q)){
tot=;
cnt=;
memset(head,,sizeof(head));
memset(tree,,sizeof(tree));
for (int i=;i<=n;i++){
scanf("%d%d",&p[i],&pw[i]);
if (p[i]== && pw[i]==){
st=i;
}else {
add(i,p[i],pw[i]);
}
}
dfs1(st,,);
dis[st]=INF;
dfs2(st,st);
buildtree(,,cnt);
while(q--){
scanf("%d%d",&uu,&vv);
printf("%d\n",qRange(uu,vv));
}
}
return ;
}

[Offer收割]编程练习赛108 - 树上的最短边 树链剖分的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  5. 【NOI P模拟赛】校门外歪脖树上的鸽子(树链剖分)

    题面 2 ≤ n ≤ 2 × 1 0 5 , 1 ≤ m ≤ 2 × 1 0 5 , 1 ≤ l ≤ r ≤ n , 1 ≤ d ≤ 1 0 8 2 ≤ n ≤ 2 × 10^5,1 ≤ m ≤ 2 ...

  6. 牛客练习赛26 E-树上路径 (树链剖分+线段树)

    链接:https://ac.nowcoder.com/acm/contest/180/E 来源:牛客网 树上路径 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语 ...

  7. hihocoder[Offer收割]编程练习赛19 D 相交的铁路线(树上路径交)

    傻逼题... 裸的树上路径交 两条树上的路径$[a,b]$和$[c,d]$有交,则有$lca(a,b)$在$[c,d]$上或$lca(c,d)$在$[a,b]$上. 其实只要深度大的$lca$在另一条 ...

  8. hiho #1283 hiho密码 [Offer收割]编程练习赛3

    #1283 : hiho密码 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这样生成的 ...

  9. [Offer收割]编程练习赛13 解题报告

    http://hihocoder.com/contest/offers13/problems 题目1 : 风格不统一如何写程序 首先:输入保证组成变量名的单词只包含小写字母. 做法:只要对不同的部分进 ...

随机推荐

  1. 为什么要使用ul li布局网站导航条?使用ul li布局网站网页导航必要性

    会布局的都知道网站导航条布局非常重要,可能一个导航条最终布局效果有时可以使用ul li列表标签布局,有时可以不用ul li布局,而是直接一个div盒子里直接放锚文本超链接的栏目名称,也能实现,看下图. ...

  2. 常用命令6--文件搜索命令4-grep

    查找不包含size字符串的文件.

  3. 使用session实现一次性验证码

    在登录页面和各种页面,会看到有验证码输入,这样做的目的是为了防止密码猜测工具破解密码,保护了用户密码安全,验证码只能使用一次,这样就给密码猜测工具带来了很大的困难,基本上阻断了密码猜测工具的使用. 可 ...

  4. Thinkphp5.0 模型hasOne、hasMany、belongsTo详解

    ThinkPHP5有关联模型的操作,但有部分初学者对数据表中常见的几种表与表的关系还存在着问题,所以使用不好关联查询. 这里将hasOne.hasMany.belongsTo进行一个详细举例说明. 首 ...

  5. 【模板】 递归线段树 [2017年五月计划 清北学堂51精英班Day4]

    P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...

  6. JavaScript之HTML DOM Document 对象

    文档对象代表您的网页. 如果您希望访问 HTML 页面中的任何元素,那么您总是从访问 document 对象开始. 下面是一些如何使用 document 对象来访问和操作 HTML 的实例. 查找 H ...

  7. 杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段

    ylbtech-杨柳絮-Info:对抗杨柳絮的7种方法和2种防治手段 园林养护人员在对抗杨柳絮上 主要有以下两种方法↓↓ 1.化学方法 化学方法是通过激素等调节剂来抑制植物发芽分化,达到减少杨柳开花的 ...

  8. Android 程序员不得不收藏的个人博客(持续更新...)

    本文已收录我的 Github ,持续更新中 ,欢迎点赞 ! 每周打开一次收藏夹里的个人博客,已经成为了我的人生一大乐趣. 相比各大博客平台,我一直更加偏爱个人博客.在每个人自己的这一亩三分地里,你能看 ...

  9. 安装docker报错问题

    安装docker容易出现错误的几种情况: 1.网络问题,无法下载完成的docker容器 2.linux内核版本必须是3.10及以上 3.可以选择使用aliyun的yum源,更好用 4.

  10. 【python小随笔】Django+错误日志(配置Django报错文件指定位置)

    1:  自定义日志文件.py----------几个文件需要创建日志,就需要重新定义几份 # 定义一个日志文件 创建一个操作日志对象logger file_1 = logging.FileHandle ...