传送门

woc这该死的码农题……

把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了

然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$

然后是几个注意点

1.线段树记两个标记,一个区间覆盖,一个区间加和

2.区间覆盖的标记更新后要把区间加和的标记删除,因为覆盖后之前的加和相当于都废了

3.因为上面那个原因,pushdown的时候先下传区间覆盖标记再下传区间加和标记

4.标记更新的时候记得把答案也一起更新

5.数组开大一点!!!

 //minamoto
#include<bits/stdc++.h>
using namespace std;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=2e5+;
int head[N],Next[N<<],ver[N<<],edge[N<<],tot=;
inline void add_edge(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
}
int dfn[N],sz[N],son[N],fa[N],dep[N],num[N],top[N],val[N],cnt,n;
void dfs1(int u){
sz[u]=,dep[u]=dep[fa[u]]+;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v!=fa[u]){
fa[v]=u,num[i>>]=v,dfs1(v),sz[u]+=sz[v];
if(sz[son[u]]<sz[v]) son[u]=v;
}
}
}
void dfs2(int u,int t){
dfn[u]=++cnt,top[u]=t;
if(son[u]){
dfs2(son[u],t);
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
}
}
}
int mx[N<<],all[N<<],add[N<<];
#define ls (p<<1)
#define rs (p<<1|1)
inline void upd(int p){mx[p]=max(mx[ls],mx[rs]);}
inline void pd(int p){
if(~all[p]){
all[ls]=all[rs]=mx[ls]=mx[rs]=all[p];
add[ls]=add[rs]=;
all[p]=-;
}
if(add[p]){
add[ls]+=add[p],add[rs]+=add[p];
mx[ls]+=add[p],mx[rs]+=add[p];
add[p]=;
}
}
void build(int p,int l,int r){
all[p]=-,add[p]=;
if(l==r) return (void)(mx[p]=val[l]);
int mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
upd(p);
}
void change(int p,int l,int r,int x){
if(l==r) return (void)(mx[p]=val[l]);
int mid=(l+r)>>;pd(p);
x<=mid?change(ls,l,mid,x):change(rs,mid+,r,x);
upd(p);
}
void update(int p,int l,int r,int ql,int qr,int x){
if(ql<=l&&qr>=r) return (void)(all[p]=x,add[p]=,mx[p]=x);
int mid=(l+r)>>;pd(p);
if(ql<=mid) update(ls,l,mid,ql,qr,x);
if(qr>mid) update(rs,mid+,r,ql,qr,x);
upd(p);
}
void ADD(int p,int l,int r,int ql,int qr,int x){
if(ql<=l&&qr>=r) return (void)(add[p]+=x,mx[p]+=x);
int mid=(l+r)>>;pd(p);
if(ql<=mid) ADD(ls,l,mid,ql,qr,x);
if(qr>mid) ADD(rs,mid+,r,ql,qr,x);
upd(p);
}
int query(int p,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r) return mx[p];
int mid=(l+r)>>,res=;pd(p);
if(ql<=mid) cmax(res,query(ls,l,mid,ql,qr));
if(qr>mid) cmax(res,query(rs,mid+,r,ql,qr));
return res;
}
inline void Change(int k,int x){
val[dfn[num[k]]]=x,change(,,n,dfn[num[k]]);
}
void Cover(int u,int v,int x){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
update(,,n,dfn[top[u]],dfn[u],x);
u=fa[top[u]];
}
if(u==v) return;
if(dep[u]<dep[v]) swap(u,v);
update(,,n,dfn[son[v]],dfn[u],x);
}
void Add(int u,int v,int x){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
ADD(,,n,dfn[top[u]],dfn[u],x);
u=fa[top[u]];
}
if(u==v) return;
if(dep[u]<dep[v]) swap(u,v);
ADD(,,n,dfn[son[v]],dfn[u],x);
}
int get(int u,int v){
int res=;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]) swap(u,v);
cmax(res,query(,,n,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(u==v) return res;
if(dep[u]<dep[v]) swap(u,v);
cmax(res,query(,,n,dfn[son[v]],dfn[u]));
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
for(int i=,u,v,e;i<n;++i)
u=read(),v=read(),e=read(),add_edge(u,v,e),add_edge(v,u,e);
dfs1(),dfs2(,);
for(int i=;i<n;++i) val[dfn[num[i]]]=edge[i<<];
build(,,n);
char s[];int u,v,x;
while(true){
scanf("%s",s+);if(s[]=='S') break;
switch(s[]){
case 'h':u=read(),x=read(),Change(u,x);break;
case 'o':u=read(),v=read(),x=read(),Cover(u,v,x);break;
case 'd':u=read(),v=read(),x=read(),Add(u,v,x);break;
case 'a':u=read(),v=read(),print(get(u,v));break;
}
}
Ot();
return ;
}

洛谷P4315 月下“毛景树”(树剖+线段树)的更多相关文章

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

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

  2. [洛谷P4315] 月下”毛景“树

    题目链接: 点我 题目分析: 树剖.将边权下放到下方点上(为什么要选深度更深的点?一个父亲可能对应多个儿子,但一个儿子只有一个父亲,即可以保证每个点只保存一条边权)成为经典点权+树剖裸题 注意链计算时 ...

  3. P4315 月下“毛景树”

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

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

    P4315 月下"毛景树"(树链剖分) 题面 简述: 边权转点权(在dfs1处转换) 把一条边权赋值在深度更深的上 需要实现对单边权的染色 , 路径边权的染色 , 路径边权的增加 ...

  5. P4315 月下“毛景树” (树链剖分+边剖分+区间覆盖+区间加+区间最大值)

    题目链接:https://www.luogu.org/problem/P4315 题目大意: 有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的.但是这棵“毛景树”有着神奇的魔力 ...

  6. P4315 月下“毛景树”[树剖]

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

  7. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  8. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

  9. 洛谷P3120 [USACO15FEB]牛跳房子(动态开节点线段树)

    题意 题目链接 Sol \(f[i][j]\)表示前\(i\)行\(j\)列的贡献,转移的时候枚举从哪里转移而来,复杂度\(O(n^4)\) 然后考虑每一行的贡献,动态开节点线段树维护一下每种颜色的答 ...

随机推荐

  1. 洛谷——P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  2. nginx.org与nginx.com有什么区别(Nginx与Nginx Plus)

    nginx.org是开源社区,管理着Nginx开源版. nginx.xom是商业社区,管理着Nginx Plus商业版. 商业版和开源版是有很大区别的,服务还加更强大的功能,当然依托开源社区加载第三方 ...

  3. Linux终端Shell下的常用快捷键收集

    删除 [Ctrl]+[D]删除光标所在位置上的字符相当于VIM里x或者dl [Ctrl]+[H]删除光标所在位置前的字符相当于VIM里hx或者dh [Ctrl]+[K]删除光标后面所有字符相当于VIM ...

  4. [WinForm]DataGridView列头右键菜单

    [WinForm]DataGridView列头右键菜单 前言 继续"不误正业" - - #,记录一下.有时候有这样的需求:DataGridView的列头菜单可以选择具体显示哪些列, ...

  5. [Javascript] Understanding the .constructor property on JavaScript Objects

    Constructor functions hold an interesting purpose in JavaScript. Unlike in classical languages, they ...

  6. VM虚拟机ping不通局域网其他主机的解决办法

    1 我的笔记本的无线网卡是自动获取IP,并且是通过无线网卡上网.   2 我的有线网卡是通过自己设定IP跟局域网的其他机器连通.当前设定的IP为172.16.17.2   3我需要连接的局域网另一个主 ...

  7. 多媒体开发之wis-stream

    在live555的mediaServer中,已经实现RTSP-over-HTTP,但默认没有开启.如果要实现这个功能,需要调用RTSPServer::setUpTunnelingOverHTTP(), ...

  8. myeclipse.hbm.xml自动生成

    第一,你的项目是否搭建了hibernate框架? 第二,你是否建立了相应的数据表: 第三,做好前两步,你再把myeclipse和数据库连接起来,在相应的表上点击右键,生成hibernate 关联文件就 ...

  9. Spring Boot Spring 自动配置

    Spring Boot 不是应用服务器: Spring Boot没有实现诸如JPA.JMS(Java Message Service)之类的Java企业级规范: Spring Boot没有引入任何形式 ...

  10. FineReport实现java报表统计图表的效果图

    Java报表-ERP图表联动 Java报表-多维坐标轴图 Java报表-静态图表 Java报表-时间坐标轴 Java报表-图表报表动态交互 Java报表-图表热点链接 Java报表-图表缩放 Java ...