题目

P4949 最短距离

做法

先把非树边提出来

查询\((x,y)\)的最短距离就分类查询:树上\((x,y)\)距离,经过非树边距离

带边权查询链长,一个烂大街的套路:树链剖分,节点维护树边距离

待修改随便搞搞就行

Code

#include<bits/stdc++.h>
typedef int LL;
const LL maxn=3e5+9;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}
return x*f;
}
struct node{
LL to,nxt,d;
}dis[maxn];
LL num;
LL head[maxn];
inline void Add(LL u,LL v,LL w){
dis[++num]=(node){v,head[u],w}; head[u]=num;
}
struct E{
LL u,v,w;
}e[maxn];
LL n,m;
LL n_tree,n_u,n_v,tim,n_d;
LL dep[maxn],size[maxn],visit[maxn],fa[maxn],val[maxn],bel[maxn],son[maxn],dx[maxn],id[maxn],top[maxn];
void Dfs1(LL u,LL f){
dep[u]=dep[f]+1;
size[u]=1; visit[u]=true;
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to); if(v==f) continue;
if(visit[v]){
n_tree=i+1>>1; n_u=u; n_v=v; n_d=dis[i].d;
continue;
}
Dfs1(v,u); size[u]+=size[v];
fa[v]=u; val[v]=dis[i].d; bel[i+1>>1]=v;
if(size[son[u]]<size[v]) son[u]=v;
}
}
void Dfs2(LL u,LL up){
dx[++tim]=u; id[u]=tim;
top[u]=up;
if(son[u]) Dfs2(son[u],up);
for(LL i=head[u];i;i=dis[i].nxt){
LL v(dis[i].to); if(v==fa[u] || v==son[u] || (i+1>>1)==n_tree) continue;
Dfs2(v,v);
}
}
struct Bit{
LL t[maxn];
inline LL Lowbit(LL x){
return x&-x;
}
inline void Add(LL x,LL val){
for(;x<=n;x+=Lowbit(x)) t[x]+=val;
}
inline LL Qy(LL x){
LL ret(0);
for(;x;x-=Lowbit(x)) ret+=t[x];
return ret;
}
inline LL Query(LL l,LL r){
return Qy(r)-Qy(l-1);
}
}Bt;
inline LL Query(LL x,LL y){
LL ret(0);
LL fx(top[x]),fy(top[y]);
while(fx!=fy){
if(dep[fx]>=dep[fy]){
ret+=Bt.Query(id[fx],id[x]); x=fa[fx];
}else{
ret+=Bt.Query(id[fy],id[y]); y=fa[fy];
}
fx=top[x]; fy=top[y];
}
if(dep[x]<=dep[y])
ret+=Bt.Query(id[x],id[y])-val[x];
else
ret+=Bt.Query(id[y],id[x])-val[y];
return ret;
}
int main(){
n=Read(); m=Read();
for(LL i=1;i<=n;++i){
LL u(Read()),v(Read()),w(Read());
Add(u,v,w); Add(v,u,w);
e[i]=(E){u,v,w};
}
Dfs1(1,0); Dfs2(1,1);
for(LL i=1;i<=n;++i)
Bt.Add(id[i],val[i]);
while(m--){
LL op(Read()),x(Read()),y(Read());
if(op==1){
if(x==n_tree){
n_d=y;
continue;
}
LL v(bel[x]);
Bt.Add(id[v],-val[v]);
Bt.Add(id[v],val[v]=y);
}else{
printf("%d\n",std::min(Query(x,y),std::min(Query(x,n_u)+Query(y,n_v)+n_d,Query(x,n_v)+Query(y,n_u)+n_d)));
}
}
return 0;
}

P4949 最短距离(基环树+树链剖分)的更多相关文章

  1. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  2. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  3. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  4. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

  5. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  6. 2019.01.08 codeforces 1009F. Dominant Indices(长链剖分)

    传送门 长链剖分模板题. 题意:给出一棵树,设fi,jf_{i,j}fi,j​表示iii的子树中距离点iii距离为jjj的点的个数,现在对于每个点iii要求出使得fif_ifi​取得最大值的那个jjj ...

  7. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  8. BZOJ 1758 / Luogu P4292 [WC2010]重建计划 (分数规划(二分/迭代) + 长链剖分/点分治)

    题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. ...

  9. hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...

随机推荐

  1. npm install 不自动生成 package-lock.json文件

    package-lock.json这个文件的作用就不详细说明了 有需要的可以参考 :https://www.cnblogs.com/cangqinglang/p/8336754.html 网上都说 n ...

  2. php 使用curl 进行简单模拟提交表单

    //初始化curl $ch = curl_init(); $url = 'xxx'; $option = [ CURLOPT_URL => $url, CURLOPT_HEADER => ...

  3. Android多线程分析之中的一个:使用Thread异步下载图像

    Android多线程分析之中的一个:使用Thread异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可.转载请注明出处 打算整理一下对 Android Fr ...

  4. Android无线测试之—UiAutomator UiScrollable API介绍三

    获取列表子元素 一.相关API介绍 返回值 API 描述 UiObject getChildByDescription(UiSelector childPattern, String text, bo ...

  5. because it violates the following Content Security Policy directive: "default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'". Note that 'script-src' was not explicitly set, so 'default-s

    html文件 修改成如下:<meta http-equiv="Content-Security-Policy" content="default-src *; st ...

  6. 移动端:判断是否微信端、判断手机操作系统(ios或android)

    http://caibaojian.com/browser-ios-or-android.htmlfunction is_weixin() { var ua = window.navigator.us ...

  7. jquery根据值设置radio和select选中状态

    1.radio选中: $("input[name=test][value=34]").attr("checked",true);//value=34的radio ...

  8. 事件对象event之e.targtet || e.srcElement

    p.onclick = function (event) { var e = event || window.event, target = e.target ? e.target : e.srcEl ...

  9. php smarty模板引擎

    <?php /* 一.什么是smarty? smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改 ...

  10. django模板之导入与继承

    组件 母版 子模板继承 2.静态文件相关 {% load static %} <link rel=-dist/css/bootstrap.css %}> <link rel=&quo ...