题目

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. 蓝桥杯 C/C++参考题目 开平方(数学题,迭代法求开方)

    开平方 如果没有计算器,我们如何求2的平方根?可以先猜测一个数,比如1.5,然后用2除以这个数字.如果我们猜对了,则除法的结果必然与我们猜测的数字相同.我们猜测的越准确,除法的结果与猜测的数字就越接近 ...

  2. (转)Unity笔记之编辑器(BeginToggleGroup、BoundsField、ColorField) ...

    1. BeginToggleGroup() BeginToggleGroup函数是定义了一个控制范围,可以控制该范围中的GUI是否启用,看下演示代码: [code]csharpcode: using ...

  3. 努比亚Z18mini多点对焦

    25点对焦 分为了中心对焦.中间对焦.边缘对焦三个区域 [参考文献] 手机上感受单反的“多点对焦”努比亚Z18mini给你想象 https://baijiahao.baidu.com/s?id=160 ...

  4. trait优先级 与 使用

    之前一直沒有讲到trait,在此我不得不提一下trait中的优先级: 在trait继承中,优先顺序依次是:来自当前类的成员覆盖了 trait 的方法,而 trait 则覆盖了被继承的方法. For e ...

  5. 基础知识《十三》深入浅出Java回调机制

    本文转载自http://hellosure.iteye.com/blog/1130176 在网上看到了一个比喻,觉得很形象,这里借用一下: 你有一个复杂的问题解决不了,打电话给你的同学,你的同学说可以 ...

  6. Codeforces Round #207 (Div. 1) B (gcd的巧妙运用)

    比赛的时候不知道怎么写... 太弱了. 看了别人的代码,觉得这个是个经典的知识点吧. gcd的巧妙运用 自己想的时候苦苦思考怎么用dp求解. 无奈字符串太长而想不出好的算法. 其实在把a和b字符串都分 ...

  7. 记录--jquery 获取父级、子级、兄弟元素 + 实例

    需求如下: 三条数据,需点击其中一条数据在其下面展示与此数据关联的图片.主要功能可能是在点击的数据下增加显示行 思路: 把需要点击增加的数据先隐藏.点击后再将其显示出来. 知识点: jQuery.pa ...

  8. 网站漏洞扫描工具(appscan,mdcsoft-ips)

    网站漏洞扫描工具:主要应用网站漏洞扫描工具,其原理是通过工具通过对网站的代码阅读,发现其可被利用的漏洞进行告示,通过前人收集的漏洞编成数据库,根据其扫描对比做出. 具体网站扫描工具有:appscan, ...

  9. Oracle Schema Objects——Tables——TableType

    Oracle Schema Objects Object Tables object type An Oracle object type is a user-defined type with a ...

  10. 改变label中的某字体颜色

    NSString *allString=@"你家在哪里,需要我送你么"; NSString *subString=@"在哪里"; UILabel *string ...