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

题目链接:P4315 月下“毛景树”

题意:请维护一个数据结构,支持

  1. 改第 kkk 条边的边权
  2. 结点 uuu 到 vvv 路径上的边权改为 kkk
  3. 结点 uuu 到 vvv 路径上的边权增加 kkk
  4. 询问结点 uuu 到 vvv 路径上的边权最大值

一看树链剖分,敲了个板子发现给的是边权

那么就只要把边权转化为点权就可以用线段树维护了

显然把父亲到儿子的边权存在儿子上更好维护

也就是把边权存在深度大的结点

在跳出top[x]!=top[y]循环时

id[x],dep[x]<dep[y]其实是原来 uuu 和 vvv 的lca,这个lca的边权显然不是 uuu 和 vvv 路径上的边

所以维护id[x]+1

然后就是少见的区间赋值操作,别跟我说ODT,怕被卡

主要难在代码实现上,直接贴了(3.79KB)

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define gc() getchar()
#define pc(a) putchar(a)
template<typename T>inline void read(T &k)
{char ch=gc();T x=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=gc();}k=x*f;
}
template<typename T>inline void write(T k)
{if(k<0){k=-k;pc('-');}if(k>9)write(k/10);pc(k%10+'0');
}
#define MAXN (int)(1e5+5)
#define Max(a,b) a=max(a,b)
struct Edge
{int u,v,w,next;
}e[MAXN<<1];
int head[MAXN],pos=1;
int n;char tmp[233];
int a[MAXN],t[MAXN],dep[MAXN],id[MAXN],idx;
int fa[MAXN],son[MAXN],sz[MAXN],top[MAXN];
int ans[MAXN<<2],tag1[MAXN<<2],tag2[MAXN<<2];
void addEdge(int u,int v,int w)
{e[pos]={u,v,w,head[u]};head[u]=pos++;
}
void dfs(int u,int f,int d)
{fa[u]=f;dep[u]=d;sz[u]=1;int mx=-1;for(int i=head[u]; i; i=e[i].next){int v=e[i].v;if(v==f)continue;dfs(v,u,d+1);sz[u]+=sz[v];t[v]=e[i].w;if(sz[v]>mx)mx=sz[v],son[u]=v;}
}
void dfs(int u,int ftop)
{id[u]=++idx;a[idx]=t[u];top[u]=ftop;if(!son[u])return;dfs(son[u],ftop);for(int i=head[u]; i; i=e[i].next){int v=e[i].v;if(v==fa[u]||v==son[u])continue;dfs(v,v);}
}
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
void push_up(int at)
{ans[at]=max(ans[ls(at)],ans[rs(at)]);
}
void build(int l,int r,int at)
{if(l==r){ans[at]=a[l];return;}int mid=(l+r)>>1;build(l,mid,ls(at));build(mid+1,r,rs(at));push_up(at);tag1[at]=-1;tag2[at]=0;
}
void proc(int l,int r,int at)
{int u=at>>1;if(tag1[u]>=0){tag1[at]=tag1[u];tag2[at]=0;ans[at]=tag1[u];}if(tag2[u]>=0){ans[at]+=tag2[u];tag2[at]+=tag2[u];}
}
void push_down(int l,int r,int at)
{int mid=(l+r)>>1;proc(l,mid,ls(at));proc(mid+1,r,rs(at));tag1[at]=-1;tag2[at]=0;
}
void update_cover(int nl,int nr,int l,int r,int k,int at)
{if(nl<=l&&r<=nr){ans[at]=k;tag1[at]=k;tag2[at]=0;return;}push_down(l,r,at);int mid=(l+r)>>1;if(nl<=mid)update_cover(nl,nr,l,mid,k,ls(at));if(nr>mid)update_cover(nl,nr,mid+1,r,k,rs(at));push_up(at);
}
void update_add(int nl,int nr,int l,int r,int k,int at)
{if(nl<=l&&r<=nr){ans[at]+=k;tag2[at]+=k;return;}push_down(l,r,at);int mid=(l+r)>>1;if(nl<=mid)update_add(nl,nr,l,mid,k,ls(at));if(nr>mid)update_add(nl,nr,mid+1,r,k,rs(at));push_up(at);
}
int query(int nl,int nr,int l,int r,int at)
{int res=-1;if(nl<=l&&r<=nr){return ans[at];}push_down(l,r,at);int mid=(l+r)>>1;if(nl<=mid)Max(res,query(nl,nr,l,mid,ls(at)));if(nr>mid)Max(res,query(nl,nr,mid+1,r,rs(at)));return res;
}
void addRange(int x,int y,int k)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);update_add(id[top[x]],id[x],1,n,k,1);x=fa[top[x]];}if(id[x]>id[y])swap(x,y);update_add(id[x]+1,id[y],1,n,k,1);
}
void coverRange(int x,int y,int k)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);update_cover(id[top[x]],id[x],1,n,k,1);x=fa[top[x]];}if(id[x]>id[y])swap(x,y);update_cover(id[x]+1,id[y],1,n,k,1);
}
int qRange(int x,int y)
{int res=-1;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]])swap(x,y);Max(res,query(id[top[x]],id[x],1,n,1));x=fa[top[x]];}if(id[x]>id[y])swap(x,y);Max(res,query(id[x]+1,id[y],1,n,1));return res;
}
signed main()
{read(n);for(int i=1,u,v,w; i<n; i++){read(u);read(v);read(w);addEdge(u,v,w);addEdge(v,u,w);}dfs(1,0,1);dfs(1,1);build(1,n,1);int l,r,x,k;while(~scanf("%s%lld%lld",tmp,&l,&r)){if(tmp[0]=='S')break;if(tmp[0]=='M')write(qRange(l,r)),pc('\n');if(tmp[0]=='A'){read(k);addRange(l,r,k);}if(tmp[1]=='h'){x=l,k=r;x=dep[e[2*x-1].v]<dep[e[2*x].v]?e[x*2].v:e[x*2-1].v;update_cover(id[x],id[x],1,n,k,1);}if(tmp[1]=='o'){read(k);coverRange(l,r,k);}}return 0;
}

转载请说明出处

洛谷P4315 月下“毛景树” 题解相关推荐

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

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

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

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

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

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

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

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

  5. BZOJ1984: 月下“毛景树”

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

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

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

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

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

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

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

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

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

最新文章

  1. hdu1715 大菲波数
  2. oracle 用户创建角色,oracle普通用户创建和加权限
  3. Mysql的coalesce
  4. 日常问题——初始化Hive仓库报错com.google.common.base.Preconditions.checkArgument
  5. 详解:设计模式之-策略设计模式
  6. java selenium教程_Selenium3 Java自动化测试完整教程
  7. mysql多张表join_mysql 连接查询(多表查询)+子查询-初学教程 3【重点】
  8. git 空提交和重置提交者(转载)
  9. 去除地址栏带#的问题
  10. 《算法图解》——狄克斯特拉算法
  11. php framework interop group,PHP超全局变量 - 山鹰sniper的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. 深入浅出JavaScript之this
  13. 【图像重建】基于matlab卷积神经网络的图像超分辨率重建【含Matlab源码 1816期】
  14. 河南省计算机基础考试题库,计算机基础考试题库
  15. ctf夏季集训结训赛-简单题writeup
  16. linux qt 找不到 lgl,Linux Qt cannot find -lGL错误完美解决方案(亲测有效)
  17. 当你痛苦时,想想别人更深重的痛苦吧!
  18. A股实践 :图神经网络与新闻共现矩阵策略(附代码)
  19. micropython 常量_MicroPython添加Module(二)
  20. 魔方(12)镜面魔方、苹果魔方、粽子魔方、三面体魔方

热门文章

  1. 连接阿里云生活物联网平台(飞燕平台)步骤记录
  2. Spring整合JPA
  3. element-ui 中的el-table表格默认的“暂无数据”修改
  4. 【机器学习】朴素贝叶斯(多分类版本)—— python3 实现方案
  5. IPVS从入门到精通kube-proxy实现原理
  6. vs:dll缺少依赖文件的解决方法
  7. linux rcs 应用程序,Linux下的rcS文件的一些分析
  8. lenove Anti-Vieus Powered by Huorong Security保护已过期怎么办
  9. Before Anything, an Architect Is a Developer
  10. 清华计算机系收自考本科生吗,成人高考可以考清华吗,成年人怎么样可以上清华北大?...