题目描述

传送门

题解

一眼链剖。
加法标记和覆盖标记不能同时出现。
add加到了cover标记上,cover+=add,add=0;
cover加到了add标记上,add=0,cover=val;
其他照旧。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;const int max_n=5e5+5;
const int max_e=max_n*2;
const int max_tree=max_n*4;
const int MININF=-2147483647;int n,m,x,y,z,u,t,k,w,N,ans;
int tot,point[max_n],next[max_e],v[max_e],c[max_e];
int father[max_n],son[max_n],faedge[max_n],sonedge[max_n],h[max_n],size[max_n];
int top[max_n],num[max_n],val[max_n];
int maxn[max_tree],cover[max_tree],add[max_tree];
char opt[10];inline void addedge(int x,int y,int z){++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z;++tot; next[tot]=point[y]; point[y]=tot; v[tot]=x; c[tot]=z;
}inline void dfs_1(int x,int fa,int dep){size[x]=1; h[x]=dep; father[x]=fa;int maxson=0;for (int i=point[x];i;i=next[i])if (v[i]!=fa){faedge[v[i]]=i;dfs_1(v[i],x,dep+1);size[x]+=size[v[i]];if (size[v[i]]>maxson){maxson=size[v[i]];son[x]=v[i];sonedge[x]=i;}}
}inline void dfs_2(int x,int fa){if (son[fa]!=x) top[x]=x;else top[x]=top[fa];if (son[x]){num[sonedge[x]]=++N;val[N]=c[sonedge[x]];dfs_2(son[x],x);}for (int i=point[x];i;i=next[i])if (v[i]!=fa&&v[i]!=son[x]){num[i]=++N;val[N]=c[i];dfs_2(v[i],x);}
}inline void update(int now){maxn[now]=max(maxn[now<<1],maxn[now<<1|1]);
}inline void pushdown(int now,int l,int r,int mid){if (cover[now]!=-1){add[now<<1]=add[now<<1|1]=0; maxn[now<<1]=cover[now];cover[now<<1]=cover[now];maxn[now<<1|1]=cover[now];cover[now<<1|1]=cover[now];cover[now]=-1;}if (add[now]){maxn[now<<1]+=add[now];if (cover[now<<1]!=-1) cover[now<<1]+=add[now];else add[now<<1]+=add[now];maxn[now<<1|1]+=add[now];if (cover[now<<1|1]!=-1) cover[now<<1|1]+=add[now];else add[now<<1|1]+=add[now];add[now]=0;}
}inline void build(int now,int l,int r){int mid=(l+r)>>1;cover[now]=-1; add[now]=0;if (l==r){maxn[now]=val[l];return;}build(now<<1,l,mid);build(now<<1|1,mid+1,r);update(now);
}inline void point_change(int now,int l,int r,int x,int v){int mid=(l+r)>>1;if (l==r){maxn[now]=v;return;}pushdown(now,l,r,mid);if (x<=mid)point_change(now<<1,l,mid,x,v);elsepoint_change(now<<1|1,mid+1,r,x,v);update(now);
}inline void interval_change(int now,int l,int r,int lrange,int rrange,int v,int opt){int mid=(l+r)>>1;if (lrange<=l&&r<=rrange){if (opt==0){maxn[now]=v; cover[now]=v;if (add[now]) add[now]=0;}else{maxn[now]+=v;if (cover[now]!=-1) cover[now]+=v;else add[now]+=v;}return; }pushdown(now,l,r,mid);if (lrange<=mid)interval_change(now<<1,l,mid,lrange,rrange,v,opt);if (mid+1<=rrange)interval_change(now<<1|1,mid+1,r,lrange,rrange,v,opt);update(now);
}inline int query(int now,int l,int r,int lrange,int rrange){int mid=(l+r)>>1,ans=MININF;if (lrange<=l&&r<=rrange) return maxn[now];pushdown(now,l,r,mid);if (lrange<=mid)ans=max(ans,query(now<<1,l,mid,lrange,rrange));if (mid+1<=rrange)ans=max(ans,query(now<<1|1,mid+1,r,lrange,rrange));return ans;
}inline void Change(int u,int t,int w,int opt){int f1=top[u],f2=top[t];while (f1!=f2){if (h[f1]<h[f2]){swap(u,t);swap(f1,f2);}interval_change(1,1,N,num[faedge[f1]],num[faedge[u]],w,opt);u=father[f1];f1=top[u];}if (u==t) return;if (h[u]>h[t]) swap(u,t);interval_change(1,1,N,num[sonedge[u]],num[faedge[t]],w,opt);
}inline int Query(int u,int t){int ans=MININF;int f1=top[u],f2=top[t];while (f1!=f2){if (h[f1]<h[f2]){swap(u,t);swap(f1,f2);}if (num[faedge[f1]]==0&&num[faedge[u]]==0) cout<<u<<"!"<<t<<endl;ans=max(ans,query(1,1,N,num[faedge[f1]],num[faedge[u]]));u=father[f1];f1=top[u];}if (u==t) return ans;if (h[u]>h[t]) swap(u,t);if (num[sonedge[u]]==0&&num[faedge[t]]==0) cout<<u<<" "<<t<<endl;ans=max(ans,query(1,1,N,num[sonedge[u]],num[faedge[t]]));return ans;
}int main(){scanf("%d",&n);for (int i=1;i<n;++i){scanf("%d%d%d",&x,&y,&z);addedge(x,y,z);}dfs_1(1,0,1);dfs_2(1,0);build(1,1,N);while (~scanf("%s",opt)){if (opt[0]=='S') return 0;switch(opt[1]){case 'h':{scanf("%d%d",&k,&w);if (num[2*k-1]) point_change(1,1,N,num[2*k-1],w);else point_change(1,1,N,num[2*k],w);break;}case 'o':{scanf("%d%d%d",&u,&t,&w);if (u==t) continue;Change(u,t,w,0);break;}case 'd':{scanf("%d%d%d",&u,&t,&w);if (u==t) continue;Change(u,t,w,1);break;}case 'a':{scanf("%d%d",&u,&t);ans=Query(u,t);printf("%d\n",ans);break;}}}
} 

总结

我可以说脏话吗?
好吧我不说脏话。
被鬼畜的错误卡一晚上,什么错误?fye:“数组开小了吧”
1、她不知道我怎么做的2、她没看我代码3、她说她瞎说的别理她4、我开大数组就过了= =
orz fye*
但是我现在还是不知道为什么数组开小罗= =
知道了之后补上。

数组能开多大就开多大。——by iwtwioi

[BZOJ1984]月下“毛景树”(树链剖分)相关推荐

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

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

  2. BZOJ1984: 月下“毛景树”

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

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

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

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

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

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

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

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

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

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

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

  8. CodeForces - 1437G Death DBMS(AC自动机fail树上树链剖分建线段树/暴跳fail)

    题目链接:点击查看 题目大意:给出 n 个模式串,每个模式串初始时的权值为 0,然后有 m 次操作: 1 i x:将第 i 个模式串的权值修改为 x 2 s:给出一个字符串 s,询问字符串 s 作为主 ...

  9. 个人赛C 柠檬树2--树链剖分+维护最值出现次数/LCA

    给一棵树,维护上面两点最短路径中结点的最大值及最大值出现次数 #include <stdio.h> #include<string.h> #include<algorit ...

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

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

最新文章

  1. 使用 Github Pages 发布你的项目文档
  2. 写给那些正奔三的80后[转]
  3. Oracle10g的flashback drop
  4. 为什么lp的最优解是一个概率_什么时候应该用概率图模型、消息传递替代传统组合优化求解器?未来工作?(持续更新)...
  5. [初级]Java命令学习系列(六)——jinfo
  6. C语言fread和fwrite的用法详解
  7. Unreal4 IOS上使用第三方库和C++11 特性问题解决
  8. java jframe tab_java Swing实现选项卡功能(JTabbedPane)实例代码
  9. chrome 样式Bug?
  10. 中科曙光服务器配置与虚拟系统安装等优化
  11. 从714里连续减去6减几次得0_一年级下册数学想加算减、破十法、连减法,家长来看看...
  12. 热门论坛排行top100--2010年07月11日[转]
  13. 常用的4款seed磁链搜索工具
  14. mysql nlssort_Oracle数据库中文拼音,部首,笔画排序问题,NLS_SORT设置
  15. 关于Qt中QMAKESPEC环境变量
  16. 提高项目10-编制三角函数表
  17. java中Map遍历的四种方式
  18. java ppt转换为html5,Apache POI PPT - PPT转换为图片
  19. Redis架构设计实现
  20. Truffle 初始化项目 truffle init

热门文章

  1. 山洋服务器R系列和Q系列区别,仔细分析:aoc u系列和q系列有区别吗?说说哪个好?大家看法如何...
  2. this.$nextTick() 学(cai)习(keng)
  3. 项目验收之时,所需文档
  4. 心情随笔:工作篇(半夜无眠,写与自己共勉)
  5. 如何获取到微信公众号的网址
  6. 【Linux】FirefoxBrowser 火狐浏览器安装 FlashPlayer 插件
  7. android 六边形简书,水波浪贝塞尔效果(六边形)
  8. Navigator对象,获取浏览器类型userAgent,机器类型platform
  9. python蓝牙模块教程_通过蓝牙将HC05蓝牙模块与python连接时出错
  10. 原生js获取元素非行内样式属性的方法