/*
我只看懂了求LCA
*/ #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define N 100005
using namespace std; int n,m,head,tot;
int first[N],fa[N][],deep[N],z[N*],que[N],sum[N*][],fd[N],start[N],endd[N],value[N]; struct edge
{
int u,v,w,next;
}edge[N<<]; inline void add_edge(int u,int v,int w)
{
++head;
edge[head].u=u;
edge[head].v=v;
edge[head].w=w;
edge[head].next=first[u];
first[u]=head;
} inline int get(int p,int d)
{
if(d==-) return p;
int x=;
while(d)
{
if(d&) p=fa[p][x];
d>>=;
x++;
}
return p;
} inline int get_lca(int a,int b)
{
if(deep[a]<deep[b]) swap(a,b);
a=get(a,deep[a]-deep[b]);
int x=;
while(a!=b)
{
if(!x||fa[a][x]!=fa[b][x])
{
a=fa[a][x];
b=fa[b][x];
x++;
}
else x--;
}
return a;
} inline int calc(int a,int b)
{
if(a==fa[b][]) return value[]-value[b];
return value[a]+fd[a];
} inline int calcp(int p,int v)
{
int l=start[p]-,r=endd[p];
while(l+<r)
{
int mid=(l+r)>>;
if(v>z[mid]) l=mid;
else r=mid;
}
return r;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
tot+=w;
add_edge(u,v,w);
add_edge(v,u,w);
}
deep[]=;
int front=,tail=;
que[]=;
while(front<=tail) //预处理每个点倍增值
{
int now=que[front++];
for(int i=first[now];i;i=edge[i].next)
{
int to=edge[i].v;
if(!deep[to])
{
deep[to]=deep[now]+;
fd[to]=edge[i].w;
fa[to][]=now;
int pre=now,x=;
while(fa[pre][x])
{
fa[to][x+]=fa[pre][x];
pre=fa[pre][x];
x++;
}
que[++tail]=to;
}
}
}
int cnt=;
for(int i=n;i;i--)
{
int now=que[i];
start[now]=cnt+;
for(int i=first[now];i;i=edge[i].next)
{
int to=edge[i].v;
if(deep[to]==deep[now]+)
{
z[++cnt]=value[to]+edge[i].w;
value[now]+=value[to]+edge[i].w;
}
}
z[++cnt]=tot-value[now];
endd[now]=cnt;
sort(z+start[now],z+endd[now]+);
sum[endd[now]][]=z[endd[now]];
sum[endd[now]][]=;
for(int i=endd[now]-;i>=start[now];i--)
{
sum[i][]=sum[i+][];
sum[i][]=sum[i+][];
if((i&)==(endd[now]&)) sum[i][]+=z[i];
else sum[i][]+=z[i];
}
cnt++;
}
for(int i=;i<=m;i++)
{
int p1,p2;
scanf("%d%d",&p1,&p2);
int lca=get_lca(p1,p2);
int dis=deep[p1]+deep[p2]-*deep[lca];
int delta=dis/+(dis&);
int px,px1,px2;
if(deep[p1]-deep[lca]<delta) px=get(p2,dis-delta);
else px=get(p1,delta);
if(deep[p1]-deep[lca]<delta-) px1=get(p2,dis-delta+);
else px1=get(p1,delta-);
if(deep[p2]-deep[lca]<dis-delta-) px2=get(p1,delta+);
else px2=get(p2,dis-delta-);
int ans=;
if(p1==px)
{
if(p2==px) ans=sum[start[px]][];
else
{
int v2=calc(px2,px);
int p=calcp(px,v2);
ans=sum[p+][]+sum[start[px]][]-sum[p][];
}
}
else
{
if(p2==px)
{
int v1=calc(px1,px);
int p=calcp(px,v1);
ans=v1+sum[p+][]+sum[start[px]][]-sum[p][];
}
else
{
int v1=calc(px1,px);
int pp1=calcp(px,v1);
int v2=calc(px2,px);
int pp2=calcp(px,v2);
if(pp2==pp1) pp2++;
if(pp1>pp2) swap(pp1,pp2);
ans=v1+sum[pp2+][dis&]+sum[pp1+][-(dis&)]-sum[pp2][-(dis&)]+sum[start[px]][dis&]-sum[pp1][dis&];
}
}
printf("%d\n",ans);
}
return ;
}

2017.10.2 国庆清北 D2T2 树上抢男主的更多相关文章

  1. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  2. 2017.10.4 国庆清北 D4T2 正方形

    题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...

  3. 2017.10.6 国庆清北 D6T2 同余方程组

    题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...

  4. 2017.10.6 国庆清北 D6T1 排序

    题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...

  5. 2017.10.3 国庆清北 D3T3 解迷游戏

    题目描述 LYK进了一家古董店,它很想买其中的一幅画.但它带的钱不够买这幅画. 幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它. 老板有一个n*m的矩阵,他想 ...

  6. 2017.10.3 国庆清北 D3T2 公交车

    题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...

  7. 2017.10.3 国庆清北 D3T1 括号序列

    题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的括号序列. 若A是合法的括号序列,则(A)是合法的括号序列. 若A和B分别是合法的括号序列,则AB是合法的 ...

  8. 2017.10.4 国庆清北 D4T1 财富

    (其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小) 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在 ...

  9. 2017.10.7 国庆清北 D7T1 计数

    题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...

随机推荐

  1. [洛谷P5323][BJOI2019]光线

    题目大意:有$n$层玻璃,每层玻璃会让$a\%$的光通过,并把$b\%$的光反射.有一束光从左向右射过,问多少的光可以透过这$n$层玻璃 题解:事实上会发现,可以把连续的几层玻璃合成一层玻璃,但是要注 ...

  2. Centos 6.10 安装 Jenkins

    前言 持续集成的概念 持续集成,Continuous integration ,简称CI. 持续集成正是针对这一类问题的一种软件开发实践.它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多 ...

  3. Hadoop 系列(五)—— Hadoop 集群环境搭建

    一.集群规划 这里搭建一个 3 节点的 Hadoop 集群,其中三台主机均部署 DataNode 和 NodeManager 服务,但只有 hadoop001 上部署 NameNode 和 Resou ...

  4. Synchronized 与Lock的不同之处

    Synchronized 与Lock的不同之处 用法不一样.synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象.而Lock需要显示地指定起始位置和终止位置.sy ...

  5. Go语言的成功也预示着Rust的成功【转】

    从整体的角度来看Go,很难理解他是怎么取得这么大的成功的.从理论的角度上来说Go是一门非常糟糕的语言,就算是和C++或者Ada之类旧语言相比也是这样. 从整体的角度来看Go,很难理解他是怎么取得这么大 ...

  6. 关闭 OSX 10.11 SIP (System Integrity Protection) 功能

    关闭 OSX 10.11 SIP (System Integrity Protection) 功能 来源 https://cms.35g.tw/coding/%E9%97%9C%E9%96%89-os ...

  7. ASP.NET MVC+Entity Framework code first 迁移

    再来一张,选择 MVC 模版,其他的没选过,不会用 =_=!! 身份验证用个人用户账户,这个是为了偷懒,话说 ASP.NET Identity  还是很给力的,不用白不用 ^_^~ 点击确定之后,会看 ...

  8. nginx mirror/post_action+gor实现https流量复制

    关于gor: 参考: https://www.cnblogs.com/jinjiangongzuoshi/p/11773070.html https://github.com/buger/gorepl ...

  9. 码云和Git使用说明

    Git下载网站: https://git-scm.com/download/win 码云网站     :https://gitee.com 下载Git,并一路下一步安装. 鼠标空白处右键点击,出现两个 ...

  10. gitlab(7.9)升级到8.0.1

    1.gitlab8.0更新说明 GitLab 8.0 现在完全集成了持续集成工具 (GitLab CI) ,此外还完全重写了 UI,节省了至少 50% 的磁盘空间.更快的合并,内置持续集成(CI)到 ...