题面:月下“毛景树”

题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好)。用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了;前三个更新的操作都可以合并起来,可以发现a到b节点间的边权max实质是a节点到b节点的路径中a下移一位后到b节点的点权max,意味着:若dep[a]<dep[b](若不是这样可交换),找点权max上跳时不能到LCA(a,b);因为重边会是连续的,所以直接(seg记录节点在线段树中的下标)seg[a]+1到seg[b]就可以了。然后要注意flag1和flag2的维护顺序以及相互的影响。

_(:3J∠)_语文太差了,不好意思

 #include<cstdio>
#include<cstring>
#include<iostream>
#define max(a,b) ((a)>(b)?(a):(b))
using namespace std;
const int maxn=,maxm=;
int N,W[maxn],num_edge=,edge_head[maxn],a,b,c,seg[maxn],rev[maxn],fa[maxn],top[maxn],son[maxn],size[maxn];
int dep[maxn],Ans;
bool E[maxm<<];
char o[];
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return f*x;
}
struct Edge{
int from,to,nx,dis;
}edge[maxm<<];
inline void Add_edge(int from,int to,int dis){
edge[++num_edge].nx=edge_head[from];
edge[num_edge].from=from;
edge[num_edge].to=to;
edge[num_edge].dis=dis;
edge_head[from]=num_edge;
return;
}
inline void Dfs(int x,int f){
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(y!=f){
W[y]=edge[i].dis;
E[i]=;
Dfs(y,x);
}
}
return;
}
inline void Dfs1(int x,int f){
size[x]=;
dep[x]=dep[f]+;
fa[x]=f;
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(y!=f){
Dfs1(y,x);
size[x]+=size[y];
if(size[y]>size[son[x]])son[x]=y;
}
}
return;
}
inline void Dfs2(int x){
if(son[x]){
int y=son[x];
seg[y]=++seg[];
rev[seg[]]=y;
top[y]=top[x];
Dfs2(y);
}
for(int i=edge_head[x];i;i=edge[i].nx){
int y=edge[i].to;
if(top[y]==){
seg[y]=++seg[];
rev[seg[]]=y;
top[y]=y;
Dfs2(y);
}
}
return;
}
struct Tree{
int l,r,maxs,flag1,flag2;
}t[maxn<<];
inline void Build(int k,int l,int r){
t[k].l=l;t[k].r=r;
if(l==r){
t[k].maxs=W[rev[l]];
return;
}
int mid=(l+r)>>,ls=k<<,rs=k<<|;
Build(ls,l,mid);Build(rs,mid+,r);
t[k].maxs=max(t[ls].maxs,t[rs].maxs);
return;
}
inline void Pushdown(int k){
int ls=k<<,rs=k<<|,flag1=t[k].flag1,flag2=t[k].flag2;
if(flag1){
t[ls].maxs=t[rs].maxs=t[ls].flag1=t[rs].flag1=flag1;
t[ls].flag2=t[rs].flag2=;
t[k].flag1=;
}
if(flag2){
t[ls].maxs+=flag2;t[rs].maxs+=flag2;
t[ls].flag2+=flag2;t[rs].flag2+=flag2;
t[k].flag2=;
}
return;
}
inline void Update(int k,int ql,int qr,int v,int o){
int l=t[k].l,r=t[k].r;
if(ql<=l&&r<=qr){
if(o==){
t[k].maxs=v;
t[k].flag1=v;
t[k].flag2=;
}
else {
t[k].maxs+=v;
t[k].flag2+=v;
}
return;
}
int mid=(l+r)>>,ls=k<<,rs=k<<|;
Pushdown(k);
if(ql<=mid)Update(ls,ql,qr,v,o);
if(mid+<=qr)Update(rs,ql,qr,v,o);
t[k].maxs=max(t[ls].maxs,t[rs].maxs);
return;
}
inline void Query(int k,int ql,int qr){
int l=t[k].l,r=t[k].r;
if(ql<=l&&r<=qr){
Ans=max(Ans,t[k].maxs);
return;
}
int mid=(l+r)>>,ls=k<<,rs=k<<|;
Pushdown(k);
if(ql<=mid)Query(ls,ql,qr);
if(mid+<=qr)Query(rs,ql,qr);
return;
}
inline void Solve(int x,int y,int v,int o){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]<dep[fy])swap(x,y),swap(fx,fy);
if(o!=)Update(,seg[fx],seg[x],v,o);
else Query(,seg[fx],seg[x]);
x=fa[top[x]];fx=top[x];
}
if(dep[x]>dep[y])swap(x,y);
if(seg[x]==seg[y])return;
if(o!=)Update(,seg[x]+,seg[y],v,o);
else Query(,seg[x]+,seg[y]);
return;
}
int main(){
N=rd();
for(int i=;i<N;i++){
a=rd();b=rd();c=rd();
Add_edge(a,b,c);
Add_edge(b,a,c);
}
Dfs(,);
Dfs1(,);
seg[]=seg[]=rev[]=top[]=;
Dfs2();
Build(,,N);
scanf("%s",o);
while(o[]!='S'){
a=rd();b=rd();
if(o[]!='M'){
if(o[]=='h'){//Change
if(E[a*-])Solve(edge[a*-].from,edge[a*-].to,b,);
else Solve(edge[a*].from,edge[a*].to,b,);
}
else if(o[]=='o'){//Cover
c=rd();
Solve(a,b,c,);
}
else{//Add
c=rd();
Solve(a,b,c,);
}
}
else{//Max
Ans=;
Solve(a,b,-,);
printf("%d\n",Ans);
}
scanf("%s",o);
}
return ;
}

By:AlenaNuna

树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”的更多相关文章

  1. [BZOJ1984][Luogu4315]月下“毛景树”

    题目大意 给出一棵 n 个点的无根树,待边权,要求维护一下操作: 修改某条边的边权 修改点 u 到点 v 路径上所有边的边权 点 u 到点 v 路径上所有边的边权加上某个值 查询点 u 到点 v 路径 ...

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

    [BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...

  3. [luogu4315]月下“毛景树”

    [luogu4315]月下"毛景树" luogu 联赛前复习一发树剖.不会告诉你WA了4发 #define ls x<<1,l,mid #define rs x< ...

  4. 【BZOJ-1984】月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1314  Solved: 416[Submit][Status][Discu ...

  5. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  6. Bzoj 1984: 月下“毛景树” 树链剖分

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1282  Solved: 410[Submit][Status][Discu ...

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

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

  8. BZOJ1984: 月下“毛景树”

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 713  Solved: 245[Submit][Status] Descri ...

  9. P4315 月下“毛景树”

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

随机推荐

  1. Windows视频桌面壁纸实现(libvlc)(类似于wall paper engine效果)

    简介 这个项目是很久之前的事情了,当时一个朋友正在研究一个国外的软件(wall paper engine ),可以在桌面壁纸层播放视频,也就差不多是动态壁纸的意思. 后来我也动手来实现这个功能,因为手 ...

  2. phpBB3.2 自动检测浏览器语言

    这是根据HTTP request header里的Accept-Language信息来处理的. 首先看一下Accept-Language的格式 Accept-Language: <languag ...

  3. android用TextView实现跑马灯效果

    今天搞啦很久,其实很简单,就加几个属性就可以啦! 图如下 : 有的说要重写TextView方法,有的说要设置固定长度,但是我没重写也没有设置固定长度也弄出来啦!跑在2.3.3的手机上面.就是不知道其他 ...

  4. loadrunner上传文件到网盘

    有人提问,loadrunner 上传文件搞不好,请求帮忙处理.让提供网址,用fiddler抓包上传部分,主要有3个请求 第一个请求GET https://yun.xxx.com/api/files/u ...

  5. SQL数据类型和C#数据类型间的转换

    今天看到SQL数据类型和C#数据类型间的转换,前人留下的. <?xml version="1.0" encoding="utf-8" ?> < ...

  6. 微信小程序开发填坑

    1.模拟器和真机的差异 在开发的过程中,在模拟器上表现得好好的,在真机上却出问题的例子数不胜数.譬如动画的使用,cover-view上面使用定位,在模拟器好好的,在真机却错乱等等等等.造成这些错乱主要 ...

  7. 【Linux】深入理解Linux中内存管理

    主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...

  8. 省市区三级联动——思路、demo、示例

    说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...

  9. Java知多少(80)图形界面设计基础

    早先程序使用最简单的输入输出方式,用户在键盘输入数据,程序将信息输出在屏幕上.现代程序要求使用图形用户界面(Graphical User Interface,GUI),界面中有菜单.按钮等,用户通过鼠 ...

  10. Oracle Enterprise Linux 6.4 下配置vncserver

    ① 安装vncserveryum install tigervnc-server ② 配置/etc/sysconfig/vncservers   配置参数   # VNCSERVERS="2 ...