题面传送门
普通树剖,注意线段树标记下推清零时左右儿子的懒标记要清零
代码实现;

#include<cstdio>
#include<cstring>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
int n,m,k,son[100039],siz[100039],d[100039],fa[100039],id[100039],idea,top[100039],x[100039],y[100039],z[100039],sx,sy, f[400039],flag[400039],sum[400039],sz;
char _s;
struct yyy{int to,w,z;};
struct ljb{int head,h[100039];yyy f[200039];inline void add(int x,int y,int z){f[++head]=(yyy){y,z,h[x]};h[x]=head;}
}s;
inline void push(int l,int r,int now){if(flag[now]){flag[now<<1]=flag[now<<1|1]=1;sum[now<<1]=sum[now<<1|1]=0;f[now<<1]=f[now<<1|1]=0;flag[now]=0;}if(f[now]){f[now<<1]+=f[now];f[now<<1|1]+=f[now];sum[now<<1]+=f[now];sum[now<<1|1]+=f[now];f[now]=0;}
}
inline void get1(int x,int y,int l,int r,int now){if(x<=l&&r<=y) {push(l,r,now);flag[now]=1,sum[now]=0;return;}push(l,r,now);int m=(l+r)>>1;if(x<=m)get1(x,y,l,m,now<<1);if(y>m) get1(x,y,m+1,r,now<<1|1);sum[now]=max(sum[now<<1],sum[now<<1|1]);
}
inline void get2(int x,int y,long long z,int l,int r,int now){if(x<=l&&r<=y) {push(l,r,now);f[now]+=z,sum[now]+=z;return;}push(l,r,now);int m=(l+r)>>1;if(x<=m) get2(x,y,z,l,m,now<<1);if(y>m) get2(x,y,z,m+1,r,now<<1|1);sum[now]=max(sum[now<<1],sum[now<<1|1]);
}
inline int find(int x,int y,int l,int r,int now){if(x<=l&&r<=y)return sum[now];push(l,r,now);int m=(l+r)>>1,ans1=-1e10,ans2=-1e10;if(x<=m) ans1=find(x,y,l,m,now<<1);if(y>m) ans2=find(x,y,m+1,r,now<<1|1);return max(ans1,ans2);
}
inline void dfs1(int x,int last){fa[x]=last;d[x]=d[last]+1;siz[x]=1;int cur=s.h[x],pus=-1;yyy tmp;while(cur!=-1){tmp=s.f[cur];if(tmp.to!=last){dfs1(tmp.to,x);siz[x]+=siz[tmp.to];if(siz[tmp.to]>pus)pus=siz[tmp.to],son[x]=tmp.to;}cur=tmp.z;}
}
inline void dfs2(int x,int last){top[x]=last;id[x]=++idea;int cur=s.h[x];yyy tmp;while(cur!=-1){tmp=s.f[cur];if(tmp.to==son[x]) get2(idea+1,idea+1,tmp.w,1,n,1),dfs2(tmp.to,last);cur=tmp.z;}cur=s.h[x];while(cur!=-1){tmp=s.f[cur];if(tmp.to!=fa[x]&&tmp.to!=son[x]) get2(idea+1,idea+1,tmp.w,1,n,1),dfs2(tmp.to,tmp.to);cur=tmp.z;}
}
inline void swap(int &x,int &y){x^=y,y^=x,x^=y;}
inline void gets1(int x,int y,int z){if(d[x]>d[y]) swap(x,y);get1(id[y],id[y],1,n,1);get2(id[y],id[y],z,1,n,1);
}
inline void gets2(int x,int y,int z){while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);get1(id[top[x]],id[x],1,n,1);get2(id[top[x]],id[x],z,1,n,1);x=fa[top[x]];}if(d[x]>d[y]) swap(x,y);get1(id[x]+1,id[y],1,n,1);get2(id[x]+1,id[y],z,1,n,1);
}
inline void gets3(int x,int y,int z){while(top[x]!=top[y]){if(d[top[x]]<d[top[y]]) swap(x,y);get2(id[top[x]],id[x],z,1,n,1);x=fa[top[x]];}if(d[x]>d[y]) swap(x,y);get2(id[x]+1,id[y],z,1,n,1);
}
inline int finds(int x,int y){int ans=0,tot=0;while(top[x]!=top[y]) {if(d[top[x]]<d[top[y]]) swap(x,y);tot=find(id[top[x]],id[x],1,n,1);ans=max(ans,tot);x=fa[top[x]];}if(d[x]>d[y]) swap(x,y);tot=find(id[x]+1,id[y],1,n,1);return max(ans,tot);
}
int main(){freopen("1.in","r",stdin);memset(s.h,-1,sizeof(s.h));register int i;scanf("%d",&n);for(i=1;i<n;i++) scanf("%d%d%d",&x[i],&y[i],&z[i]),s.add(x[i],y[i],z[i]),s.add(y[i],x[i],z[i]);dfs1(1,0);dfs2(1,1);while(1){_s=getchar();while(_s<'A'||_s>'Z') _s=getchar();if(_s=='S') return 0;if(_s=='C'){_s=getchar();if(_s=='h') _s=getchar(),_s=getchar(),_s=getchar(),_s=getchar(),scanf("%d%d",&sx,&sz),gets1(x[sx],y[sx],sz);else _s=getchar(),_s=getchar(),_s=getchar(),scanf("%d%d%d",&sx,&sy,&sz),gets2(sx,sy,sz);}else if(_s=='A'){_s=getchar(),_s=getchar();scanf("%d%d%d",&sx,&sy,&sz);gets3(sx,sy,sz);}else{_s=getchar(),_s=getchar();scanf("%d%d",&sx,&sy);printf("%d\n",finds(sx,sy));}}
}

luogu P4315 月下“毛景树”相关推荐

  1. P4315 月下“毛景树” (树链剖分)

    题目链接: P4315 月下"毛景树" 大致题意 给定一棵由nnn个节点的树, 由n−1n - 1n−1带权边构成. 有如下444种操作: Change k c: 把第kkk条边的 ...

  2. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  3. 洛谷P4315 月下“毛景树”

    题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的"毛景树&quo ...

  4. 洛谷 P4315 月下“毛景树”(边树剖)

    题目不算难,但是代码量需要控制 主要说一下线段树上的操作,因为有两个相关的区间操作标记,应该先覆盖后增加,因为覆盖操作会影响增加操作 const int N=1e5+5;int n,m;int i,j ...

  5. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下"毛景树" 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来, ...

  6. [bzoj1984]月下“毛景树” 树链剖分

    1984: 月下"毛景树" Time Limit: 20 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Descriptio ...

  7. BZOJ1984: 月下“毛景树”

    BZOJ 1984: 月下"毛景树" Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1583  Solved: 500 [Subm ...

  8. [BZOJ1984] 月下“毛景树”

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...

  9. 【洛谷P4315】月下“毛景树”(树链剖分)

    这是一道毒瘤题. 首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了 但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号*2(因为是双 ...

  10. bzoj 1984: 月下“毛景树” 线段树+树链剖分

    题意 给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成 ...

最新文章

  1. linux kernel中的wait_for_completion和complete总结
  2. 1003. 二哥养细菌—java
  3. 测试开发面试准备之Selenium 工作原理
  4. Android Log工具类,Toast工具类,获取当前方法名称
  5. Linux/Ubuntu 单机安装配置 zookeeper
  6. Madagascar的自定义浮点型函数--对数函数
  7. [JS基础] 之类型判断
  8. bat 字符串截取操作
  9. 中继联通chinaunicom热点。求路由推荐。-无线路由器-中国无线论坛 -
  10. 白鸦:我印象中的Keso
  11. 【通信】基于matlab量子密钥分发密钥率仿真【含Matlab源码 1662期】
  12. html 实现页面加载进度,网页加载进度条实现方案
  13. c语言答案doc,c语言考试试题及答案
  14. 集成 push kit 签名配置报6003/收不到华为推送
  15. CF417D--- Cunning Gena(序列+像缩进dp)
  16. 【前端面试】04 HTTP协议
  17. 联想服务器怎么做系统备份,联想笔记本怎么做系统备份
  18. python常见开源库整理
  19. 广度搜索与深度搜索的区别
  20. Nginx服务器安装

热门文章

  1. MediBangPaint Pro for mac(优秀漫画制作软件)
  2. 冬季茄子怎么吃营养价值翻倍
  3. win10磁盘管理_一步一步的详细讲解Win10磁盘分区教程
  4. 【笔记】《算法竞赛 从入门到进阶(罗勇军)》第7章 动态规划
  5. DirectX11海洋模拟实践
  6. 蓝牙(四)LMP协议解析之二
  7. react中Suspense,EventEmitter的使用
  8. 颜色空间:RGB,CMY,HSV,HSL,Lab详解
  9. 【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装...
  10. Vmware_jjbLite_jb51不是有效的短文件名