树上路径问题还有一个比较好的差分就是利用到根节点的信息。。

题目的形式显然是一个一次函数,于是想到维护一次函数最小值

上升路径就是: A(d[x]-d[o])+B   =  -Ad[o]+(B-Ad[x]);

下降路径:       A(d[x]+d[o]-2*d[lca])+B = Ad[o]+(B+A(d[o]-2*d[lca]))

维护新函数  ,查询的时候分下去查。。由于需要区间答案,所以就需要up

标记永久就不需要down

注:

1、注意区分原树和线段树

2、注意查询的内容范围外、范围内

3、注意运算顺序

4、注意 long long

5、注意d 和 dui 对应关系

码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100005
#define ll long long
bool cz[N<<2];
int n,m,fu[N],sz[N],zhong[N<<1],tot,hou[N<<1],xia[N],wz[N],top[N],hson[N],cnt,op,lca,x,y,i,dui[N];
ll v[N<<1],d[N],a,b,c,kk[N<<2],bb[N<<2],A,B,ans,minn[N<<2];
void jian(int a,int b,ll c)
{++tot;hou[tot]=xia[a],xia[a]=tot,zhong[tot]=b,v[tot]=c;
}
void jia(int a,int b,ll c)
{jian(a,b,c);jian(b,a,c);
}
void dfs1(int o,int fa,ll dis)
{sz[o]=1;d[o]=dis;fu[o]=fa;int i,nd;for(i=xia[o];i!=-1;i=hou[i]){nd=zhong[i];if(nd==fa)continue;dfs1(nd,o,dis+v[i]);if(sz[hson[o]]<sz[nd])hson[o]=nd;sz[o]+=sz[nd];}
}
void dfs2(int o,int tap)
{top[o]=tap;int i,nd;wz[o]=++cnt;dui[cnt]=o;if(hson[o])dfs2(hson[o],tap);for(i=xia[o];i!=-1;i=hou[i]){nd=zhong[i];if(nd==fu[o]||nd==hson[o])continue;dfs2(nd,nd);  }
}
void up(int o,ll l,ll mid,ll r)
{minn[o]= cz[o]? min(kk[o]*d[dui[l]]+bb[o],kk[o]*d[dui[r]]+bb[o]):123456789123456789  ;minn[o]=min(min(minn[o<<1],minn[o<<1|1]),minn[o]);
}
void gai(int o,int  l,int  r)
{int mid=(l+r)/2;if(op==1)//上升 {
if(a<=l&&r<=b)
{
if(cz[o]==0||(kk[o]*d[dui[l]]+bb[o] >  -A*d[dui[l]]+(B+A*d[x])  && kk[o]*d[dui[r]]+bb[o] >  -A*d[dui[r]]+(B+A*d[x]) ))
{cz[o]=1;kk[o]=-A;bb[o]=B+A*d[x];minn[o]=min(minn[o],min( -A*d[dui[l]]+(B+A*d[x]),-A*d[dui[r]]+(B+A*d[x])));return ;
}
if(kk[o]*d[dui[l]]+bb[o] <=  -A*d[dui[l]]+(B+A*d[x])  && kk[o]*d[dui[r]]+bb[o] <=  -A*d[dui[r]]+(B+A*d[x]) )
{return ;
}
long double jd=1.0000000*((B+A*d[x])-bb[o])/(1.0000000*(kk[o]+A));
if(jd<=d[dui[mid]])
{gai(o<<1,l,mid);if(kk[o]*d[dui[r]]+bb[o] > - A*d[dui[r]]+(B+A*d[x]) )gai(o<<1|1,mid+1,r);
}else
{gai(o<<1|1,mid+1,r);if(kk[o]*d[dui[l]]+bb[o] >  -A*d[dui[l]]+(B+A*d[x]) )gai(o<<1,l,mid);
}
}else
{
if(a<=mid)gai(o<<1,l,mid);
if(b>mid)gai(o<<1|1,mid+1,r);
}       }if(op==0)//下降{
if(a<=l&&r<=b)
{
if(cz[o]==0||(kk[o]*d[dui[l]]+bb[o] >  A*d[dui[l]]+(B+A*(d[x]-2*d[lca]))  && kk[o]*d[dui[r]]+bb[o] >  A*d[dui[r]]+(B+A*(d[x]-2*d[lca])) ))
{cz[o]=1;kk[o]=A;bb[o]=B+A*(d[x]-2*d[lca]);minn[o]=min(min(A*d[dui[l]]+(B+A*(d[x]-2*d[lca])),  A*d[dui[r]]+(B+A*(d[x]-2*d[lca])) ),minn[o]);return ;
}
if(kk[o]*d[dui[l]]+bb[o] <=  A*d[dui[l]]+(B+A*(d[x]-2*d[lca]))  && kk[o]*d[dui[r]]+bb[o] <=  A*d[dui[r]]+(B+A*(d[x]-2*d[lca])) )
{return ;
}
long double jd=1.0000000*(B+A*(d[x]-2*d[lca])-bb[o])/(1.0000000*(kk[o]-A));
if(jd<=d[dui[mid]])
{gai(o<<1,l,mid);if(kk[o]*d[dui[r]]+bb[o] >   A*d[dui[r]]+(B+A*(d[x]-2*d[lca])) )gai(o<<1|1,mid+1,r);
}else
{gai(o<<1|1,mid+1,r);if(kk[o]*d[dui[l]]+bb[o] >  A*d[dui[l]]+(B+A*(d[x]-2*d[lca])) )gai(o<<1,l,mid);
}
}else
{
if(a<=mid)gai(o<<1,l,mid);
if(b>mid)gai(o<<1|1,mid+1,r);
}       }if(op==2){
if(cz[o])ans=min(min( d[dui[min(1ll*r,b)]]*kk[o]+bb[o], d[dui[max(1ll*l,a)]]*kk[o]+bb[o]    ),ans);if(a<=l&&r<=b){
ans=min(ans,minn[o]);return ;
}if(a<=mid)gai(o<<1,l,mid);       if(b>mid)gai(o<<1|1,mid+1,r); }
if(l!=r)up(o,l,mid,r);
}
int LCA(int x,int y)
{while(top[x]!=top[y]){if(d[top[x]]<d[top[y]])swap(x,y);x=fu[top[x]];} if(d[x]>d[y])swap(x,y);
return x;
}
void work(int x,int y)
{  lca=LCA(x,y);while(top[x]!=top[lca]){a=wz[top[x]];b=wz[x];gai(1,1,n);x=fu[top[x]];} a=wz[lca];b=wz[x];gai(1,1,n);
if(op==1)op=0;   while(top[y]!=top[lca]){a=wz[top[y]];b=wz[y];gai(1,1,n);y=fu[top[y]];}  a=wz[lca];b=wz[y];gai(1,1,n);
}
void csh(int o,int l,int r)
{minn[o]=123456789123456789;if(l==r)return ;int mid=(l+r)>>1;csh(o<<1,l,mid);csh(o<<1|1,mid+1,r);
}
int main()
{
memset(xia,-1,sizeof(xia));scanf("%d%d",&n,&m);csh(1,1,n);for(i=1;i<n;i++){scanf("%lld%lld%lld",&a,&b,&c);jia(a,b,c);}dfs1(1,1,0);dfs2(1,1);while(m--){scanf("%d",&op);if(op==1){scanf("%d%d%lld%lld",&x,&y,&A,&B);work(x,y);}else{ans=123456789123456789;scanf("%d%d",&x,&y);work(x,y);printf("%lld\n",ans);}}
}

bzoj4515 [Sdoi2016]游戏 标记永久线段树+链剖+差分相关推荐

  1. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★

    P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...

  2. 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 45  Solved: 30 [Submit][Status][Discuss] ...

  3. 【HDU - 4509】湫湫系列故事——减肥记II(合并区间模板 or 离散化标记 or 线段树)

    题干: 虽然制定了减肥食谱,但是湫湫显然克制不住吃货的本能,根本没有按照食谱行动!  于是,结果显而易见-  但是没有什么能难倒高智商美女湫湫的,她决定另寻对策--吃没关系,咱吃进去再运动运动消耗掉不 ...

  4. 带lazy标记的线段树

    线段树的lazy操作 以POJ 2777 Count Color为例. 线段树,是一个满的二叉树,每次每一个子节点都是父节点的一半.所以二叉树的每个节点都维护了一个区间.可是实现快速的查询. 对于更新 ...

  5. 对空防御的训练 改编自BZOJ3165 (线段树永久化标记 李超线段树)

    对空防御的训练 256MB / 1s ; defense.cpp / c / pas / in / out [题目描述] 秋月十分擅长对空作战.尽管如此,必要的训练也不能懈怠. 在一次训练中,会有m个 ...

  6. 洛谷 - P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并(树上差分+线段树合并)

    题目链接:点击查看 题目大意:给出一棵树,再给出 m 次操作,每次操作会选择两个点 ( x , y ) ,使得这条路径上的所有点的种类 z 加一,最后问每个点的哪个种类出现的频率最高,若多个种类出现频 ...

  7. CodeChef - DGCD——树链剖分+差分

    [题目描述] You're given a tree on N vertices. Each vertex has a positive integer written on it, number o ...

  8. BZOJ 3626 LCA(离线+树链剖分+差分)

    显然,暴力求解的复杂度是无法承受的. 考虑这样的一种暴力,我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第一个有标记的点求出它的深度统计答案.观察到,深度其实就是上面有几个已 ...

  9. 雨中的尾巴(线段树合并+树上差分)

    哇这道题 恶心死我 首先要知道,树上差分一般解决的问题是关于树上的覆盖问题 然后遇到覆盖问题尽量不要打树剖(会慢很多) 关于此题 因为这道题覆盖的是 从xxx到yyy的点 所以我们在 x,yx,yx, ...

最新文章

  1. SELinux与强制访问控制系统应用
  2. 矿用巷道巡检机器人_一种井下自动巡检机器人系统
  3. 二维数组初始化的形式有?
  4. rabbitMQ教程 一篇文章看懂rabbitMQ
  5. 虚拟机VirtualBox中Ubuntu无法全屏(终极解决方法)
  6. [Android开源项目] GitHub开源项目总结 (转)
  7. php radio样式美化,微信小程序修改radio组件默认样式
  8. linux下配置squid 服务器,最简单使用方式
  9. 入行AI最需要的五大技能
  10. python切面编程_python编程上可九天揽月,下可五洋捉鳖,10行代码进行图像识别...
  11. 实习成长之路——Spring Bean 二:如何注册BeanDefinition?
  12. 项目_电商_淘淘商城_0000
  13. mysql数据库常用sql语句
  14. JPA环境下使用Hibernate二级缓存
  15. 超好用json转excel工具
  16. hibernate还有人用吗
  17. LNMP搭建kodcloud个人私有网盘
  18. STEP2——《数据分析:企业的贤内助》重点摘要笔记(三)——数据录入
  19. java中super的三种用法
  20. electron+vue3+vite2 如何使用打印

热门文章

  1. Java虚拟机------JVM分析工具
  2. LeetCode 剑指Offer 64.求1,2到n的和, 不使用循环/判断及乘除
  3. (组合数学笔记)格点路径问题分析求解
  4. 统计学习方法第二版知识点合集 - 自用笔记
  5. 特征工程系列之降维:用PCA压缩数据
  6. java.util.vector中的vector的详细用法
  7. vue中检测断网处理
  8. mvn linux,Linux安装Maven
  9. python自加1_python中有自增
  10. python布尔类型运算_python布尔运算记录