传送门

Ananlysis

get 一个新技能
如果要处理边权,就把边权移到儿子节点上去,当做点权进行处理
修改的时候不修改其lca即可
(隔壁dalao说:“这不是常规操作吗……”)

然后就是树剖常规操作
单点修改,区间覆盖,区间修改,区间最大值维护

。。线段树区间覆盖和区间加操作。。写错真的是脑子的问题了……在进行区间加的时候是不会对区间覆盖的标记操作的,不然到时候下传就会加两次了

感谢gsj神仙,cxr神仙,cyk神仙

Code
#include<bits/stdc++.h>
#define re register
#define in read()
#define lc (k<<1)
#define rc (k<<1)|1
using namespace std;
inline int read(){char ch;int f=1,res=0;while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;while(ch>='0'&&ch<='9'){res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}return f==1?res:-res;
}
const int N=100009;
const int M=200009;
int a[N],pt[M],n;
int nxt[M],head[N],to[M],w[M],ecnt=0;
inline void add(int x,int y,int z){nxt[++ecnt]=head[x];head[x]=ecnt;to[ecnt]=y;w[ecnt]=z;
}
int dep[N],fa[N],sze[N],son[N],top[N],pos[N],idx[N],t=0;
struct node{int lzy,tag,maxn;inline friend node operator + (const node &a,const node &b){node c;c.lzy=0;c.tag=-1;c.maxn=max(a.maxn,b.maxn);return c;}
}seg[N<<2];
void build(int k,int l,int r){seg[k].tag=-1;seg[k].lzy=0;if(l==r){seg[k].maxn=a[idx[l]];return;    }int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r);seg[k]=seg[lc]+seg[rc];
}
inline void pushnow1(int k,int v){seg[k].maxn+=v;
//  if(seg[k].tag!=-1) seg[k].tag+=v;不要这句!seg[k].lzy+=v;
}
inline void pushnow2(int k,int v){seg[k].maxn=v;seg[k].tag=v;seg[k].lzy=0;
}
inline void pushdown(int k){if(seg[k].tag!=-1){pushnow2(lc,seg[k].tag);pushnow2(rc,seg[k].tag);seg[k].tag=-1;}if(seg[k].lzy){pushnow1(lc,seg[k].lzy);pushnow1(rc,seg[k].lzy);seg[k].lzy=0;}
}
void Add(int k,int l,int r,int x,int y,int z){if(x<=l&&r<=y) {pushnow1(k,z);return;}int mid=l+r>>1;pushdown(k);if(x<=mid) Add(lc,l,mid,x,y,z);if(y>mid) Add(rc,mid+1,r,x,y,z);seg[k]=seg[lc]+seg[rc];
}
void cover(int k,int l,int r,int x,int y,int z){if(x<=l&&r<=y){pushnow2(k,z);return;}int mid=l+r>>1;pushdown(k);if(x<=mid) cover(lc,l,mid,x,y,z);if(y>mid) cover(rc,mid+1,r,x,y,z);seg[k]=seg[lc]+seg[rc];
}
node query(int k,int l,int r,int x,int y){if(x<=l&&r<=y) return  seg[k];int mid=l+r>>1;pushdown(k);if(x>mid) return query(rc,mid+1,r,x,y);if(y<=mid) return query(lc,l,mid,x,y);return query(lc,l,mid,x,y)+query(rc,mid+1,r,x,y);
}
void dfs1(int u,int fu){dep[u]=dep[fu]+1;fa[u]=fu;sze[u]=1;for(re int e=head[u];e;e=nxt[e]){int v=to[e];if(v==fu) continue;a[v]=w[e];pt[(e+1)/2]=v;dfs1(v,u);sze[u]+=sze[v];if(sze[v]>sze[son[u]]) son[u]=v;}
}
void dfs2(int u){if(son[u]){int v=son[u];top[v]=top[u];idx[pos[v]=++t]=v;dfs2(v);}for(re int e=head[u];e;e=nxt[e]){int v=to[e];      if(v==fa[u]||v==son[u]) continue;top[v]=v;idx[pos[v]=++t]=v;   dfs2(v);}
}
inline void addpath(int x,int y,int w){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);Add(1,1,n,pos[top[x]],pos[x],w);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);if(pos[y]+1<=pos[x]) Add(1,1,n,pos[y]+1,pos[x],w);
}
inline void coverpath(int x,int y,int w){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);cover(1,1,n,pos[top[x]],pos[x],w);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);if(pos[y]+1<=pos[x]) cover(1,1,n,pos[y]+1,pos[x],w);
}
inline int querypath(int x,int y){node tmp;int ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);tmp=query(1,1,n,pos[top[x]],pos[x]);ans=max(tmp.maxn,ans);x=fa[top[x]];}if(dep[x]<dep[y]) swap(x,y);if(pos[y]+1<=pos[x])tmp=query(1,1,n,pos[y]+1,pos[x]);return max(ans,tmp.maxn);
}
int main(){n=in;int aa,b,c;for(re int i=1;i<n;++i){aa=in;b=in;c=in;add(aa,b,c);add(b,aa,c);}pos[t=1]=1;idx[1]=1;top[1]=1;dfs1(1,0);dfs2(1);build(1,1,n);int u,v,w;char st[10];while(1){scanf("%s",st);if(st[0]=='S') return 0;if(st[0]=='C'&&st[1]=='h'){u=in;w=in;//单点修改 --> 区间覆盖这一个点 cover(1,1,n,pos[pt[u]],pos[pt[u]],w);}else if(st[0]=='C'&&st[1]=='o'){u=in;v=in;w=in;coverpath(u,v,w);}else if(st[0]=='A'){u=in;v=in;w=in;//区间加addpath(u,v,w);}else {u=in;v=in;printf("%d\n",(u==v)?0:querypath(u,v));}}return 0;
}

树链剖分 - 月下“毛景树”(BZOJ 4151)相关推荐

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

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

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

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

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

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

  4. BZOJ1984: 月下“毛景树”

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

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

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

  6. 【BZOJ4515】游戏,树链剖分+永久化标记线段树维护线段信息(李超线段树)

    Time:2016.05.10 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 李超线段树 一开始听faebdc讲,并没有听的很懂ww 后来找到良心博文啊有木有 折越 首先可以把修改 ...

  7. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

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

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

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

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

  10. 计蒜客 - Distance on the tree(树链剖分+离线处理+线段树)

    题目链接:点击查看 题目大意:给出一颗含有n个节点的树,每条边都有权值,现在给出m个询问,每次询问的格式为u,v,w,我们需要求出在路径u-v上,边权小于等于w的边的个数 题目分析:因为一开始不会主席 ...

最新文章

  1. 鹅厂AI科学家,偷偷把无人摩托写进了年终总结
  2. 《自然》,工程学突破!仿生物细胞群体机器人问世
  3. PHP学习笔记-PHP与Web页面的交互2
  4. Windows Server 2012正式版RDS系列⑥
  5. java 迪杰斯特拉_Java 实现Dikstra迪杰斯特拉算法 关于单源顶点最短路径问题的求解...
  6. macos 此服务器的证书无效_跨平台本地SSL证书生成工具,本地也能优雅的调试https...
  7. Linux学习日记——源码编译Apache
  8. Netflix:为什么建立专门的媒体数据库?
  9. 6月21日武汉见!华为nova 5正式官宣:麒麟980+40W快充
  10. Android 相关翻译
  11. 代理模式 委派模式 策略模式_委派模式和策略模式
  12. 归并排序法计算逆序对数
  13. MybatisPlus官方文档
  14. latex 数学公式_推荐一款编写数学公式的国产神器:AxMath,可与LATEX双向转换
  15. win10下装黑苹果双系统_黑苹果macOS10.15.4单硬盘三系统安装教程
  16. 秋意浪漫风景如画 诗情画意 谁能读懂一个浪子的心
  17. “eclipse”出现异常,“install new software”工具 无法使用,提示“Operation cannot be completed”错误的解决方案。
  18. 达尔优EM915镜面板游戏鼠标拆机教程
  19. npm install安装报错:gyp info it worked if it ends with ok的解决方法
  20. 程序员纹身被拍引网友热议,代码身上纹,我是社会人!

热门文章

  1. 买房贷款月供怎么算?贷款利息是多少?
  2. Android怎么在Service中执行耗时操作
  3. 面试面经 | 2021大疆嵌入式软件工程师笔试题B卷
  4. Elasticsearch之快速入门篇(个人笔记)
  5. 脱壳之压缩壳-FSG
  6. 图像处理_彩色图像处理_推导产生一幅彩色图像的补色的CMY变换
  7. 客服QQ,打开临时会话框(不用加为好友)
  8. Hello Juejin
  9. CTF Alice与Bob
  10. 一个小白的自渡-Git 仓库基础操作