BZOJ 1984: 月下“毛景树” (树链剖分+线段树)
注意赋值和加法的标记下传优先级.具体看代码.
CODE
#include <vector>
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
#define ls (i<<1)
#define rs (i<<1|1)
inline void read(int &num) {
char ch; int flg=1; while(!isdigit(ch=getchar()))if(ch=='-')flg=-flg;
for(num=0; isdigit(ch); num=num*10+ch-'0',ch=getchar()); num*=flg;
}
const int MAXN = 100005;
const int INF = 1e9;
int n, w[MAXN], dfn[MAXN], seq[MAXN], tmr;
int fir[MAXN], cnt, bel[MAXN]; //bel表示某条边下面是哪个点
struct edge { int to, nxt, w, i; }e[MAXN<<1];
inline void add(int u, int v, int wt, int id) {
e[cnt] = (edge){ v, fir[u], wt, id }, fir[u] = cnt++;
e[cnt] = (edge){ u, fir[v], wt, id }, fir[v] = cnt++;
}
int dep[MAXN], fa[MAXN], sz[MAXN], top[MAXN], son[MAXN];
void dfs(int u, int ff) {
dep[u] = dep[fa[u]=ff] + (sz[u]=1);
for(int v, i = fir[u]; ~i; i = e[i].nxt)
if((v=e[i].to) != fa[u]) {
w[bel[e[i].i] = v] = e[i].w, dfs(v, u), sz[u] += sz[v];
if(sz[v] > sz[son[u]]) son[u] = v;
}
}
void dfs2(int u, int tp) {
top[u] = tp; seq[dfn[u] = ++tmr] = u;
if(son[u]) dfs2(son[u], tp);
for(int v, i = fir[u]; ~i; i = e[i].nxt)
if((v=e[i].to) != son[u] && v != fa[u]) dfs2(v, v);
}
int mx[MAXN<<2], lz[MAXN<<2], c[MAXN<<2];
inline void upd(int i) { mx[i] = max(mx[ls], mx[rs]); }
inline void mt(int i) {
if(~c[i]) { //先传赋值标记
mx[ls] = mx[rs] = c[i];
lz[ls] = lz[rs] = 0;
c[ls] = c[rs] = c[i];
c[i] = -1;
}
if(lz[i]) {
mx[ls] += lz[i], mx[rs] += lz[i];
lz[ls] += lz[i], lz[rs] += lz[i];
lz[i] = 0;
}
}
void build(int i, int l, int r) {
lz[i] = 0, c[i] = -1;
if(l == r) { mx[i] = w[seq[l]]; return; }
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid+1, r);
upd(i);
}
void modify(int i, int l, int r, int x, int y, int val) {
if(l == x && r == y) {
mx[i] += val, lz[i] += val;
return;
}
int mid = (l + r) >> 1;
mt(i);
if(y <= mid) modify(ls, l, mid, x, y, val);
else if(x > mid) modify(rs, mid+1, r, x, y, val);
else modify(ls, l, mid, x, mid, val), modify(rs, mid+1, r, mid+1, y, val);
upd(i);
}
void cover(int i, int l, int r, int x, int y, int val) {
if(l == x && r == y) {
mx[i] = c[i] = val; lz[i] = 0;
return;
}
int mid = (l + r) >> 1;
mt(i);
if(y <= mid) cover(ls, l, mid, x, y, val);
else if(x > mid) cover(rs, mid+1, r, x, y, val);
else cover(ls, l, mid, x, mid, val), cover(rs, mid+1, r, mid+1, y, val);
upd(i);
}
int query(int i, int l, int r, int x, int y) {
if(l == x && r == y) return mx[i];
int mid = (l + r) >> 1, res = 0;
mt(i);
if(y <= mid) res = query(ls, l, mid, x, y);
else if(x > mid) res = query(rs, mid+1, r, x, y);
else res = max(query(ls, l, mid, x, mid), query(rs, mid+1, r, mid+1, y));
upd(i);
return res;
}
inline int Max(int x, int y) {
int res = 0;
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
res = max(res, query(1, 1, n, dfn[top[x]], dfn[x]));
x = fa[top[x]];
}
if(x == y) return res;
if(dfn[x] < dfn[y]) swap(x, y);
res = max(res, query(1, 1, n, dfn[y]+1, dfn[x]));
return res;
}
inline void Add(int x, int y, int val) {
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
modify(1, 1, n, dfn[top[x]], dfn[x], val);
x = fa[top[x]];
}
if(x == y) return;
if(dfn[x] < dfn[y]) swap(x, y);
modify(1, 1, n, dfn[y]+1, dfn[x], val);
}
inline void Cover(int x, int y, int val) {
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]]) swap(x, y);
cover(1, 1, n, dfn[top[x]], dfn[x], val);
x = fa[top[x]];
}
if(x == y) return;
if(dfn[x] < dfn[y]) swap(x, y);
cover(1, 1, n, dfn[y]+1, dfn[x], val);
}
int main() {
memset(fir, -1, sizeof fir);
read(n);
for(int i = 1, x, y, z; i < n; ++i)
read(x), read(y), read(z), add(x, y, z, i);
dfs(1, 0); dfs2(1, 1);
build(1, 1, n);
char s[2]; int x, y, z;
while(1) {
while(!isalpha(s[0]=getchar())); s[1] = getchar();
if(s[0] == 'S') return 0;
read(x), read(y);
if(s[0] == 'M') printf("%d\n", Max(x, y));
else if(s[0] == 'A') read(z), Add(x, y, z);
else if(s[0] == 'C' && s[1] == 'o') read(z), Cover(x, y, z);
else Cover(fa[bel[x]], bel[x], y);
}
}
BZOJ 1984: 月下“毛景树” (树链剖分+线段树)的更多相关文章
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- Bzoj 1984: 月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1282 Solved: 410[Submit][Status][Discu ...
- BZOJ 1984月下“毛景树” LCT维护边权 + 下传标记
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...
- BZOJ 1984 月下“毛景树”
我觉得我要把BZOJ上的链剖写完了吧.... #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 【BZOJ】1984 月下“毛景树”
[算法]树链剖分+线段树 [题解]线段树的区间加值和区间覆盖操作不能同时存在,只能存在一个. 修改:从根节点跑到目标区域路上的标记全部下传,打完标记再上传回根节点(有变动才需要上传). 询问:访问到目 ...
- BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)
BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...
- BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)
前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...
随机推荐
- 关于vs code文本编辑器的快捷键
另一篇编辑器Sublime Text下载.使用教程.插件推荐说明.全套快捷键 基础编辑 快捷键 作用 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+Shift+K 删除当前行 Ctrl+Enter ...
- asp.net 12 AJAX
Javascript:ajax Ajax:get <%@ Page Language="C#" AutoEventWireup="true" CodeBe ...
- Pycharm 加载pygame解决方案
按照<python编程从入门到实践>上的教程下载了pygame的whl文件进行安装, 在cmd窗口里import pygame提示无错误,在IDEL里程序也能正常运行, 但是pycharm ...
- layer插件loading快速应用示例
1.页面引用<link rel="stylesheet" href="../Js/layer/skin/layer.css" /><scri ...
- whistle学习(二)之启动、停止、重启、更新whistle等命令
新版本的whistle支持三种等价命令whistle,w2,wproxy 启动whistle w2 start 启动时指定端口 w2 start -p (// 不设置端口默认使用8899) 默认端口为 ...
- Google谷歌总部员工家庭活动
每年Google总部都会有针对家庭的两个大活动,其中一个就是万圣节.专门针对员工孩子的.#2019Googleween 今年的Googleween分几个场地,所以每个场地很小.她爸爸只带她去了一个.我 ...
- O059、Backup Volume 操作
参考https://www.cnblogs.com/CloudMan6/p/5662236.html BackUp是将Volume备份到别的地方(备份设备),将来可以通过restore操作恢复. ...
- 使用svn遇到的问题---(在编辑器没有配置svn的前提下)
日常写代码的过程中新增了文件,一般都是继续文件的书写,写完一部分后提交 新增文件后面经常忘记了add后commit 原来是可以在commit时勾选左下角的 [show unversioned file ...
- nginx 配置简单的静态页面
nginx 文件服务配置,MIME和 default_type https://blog.csdn.net/qq_26711103/article/details/81116900 nginx 静态页 ...
- Spring特点与工作原理
根据多个参考资料,总结如下: Spring的概念 Spring是一种多层的J2EE应用程序框架,其核心就是提供一种新的机制管理业务对象及其依赖关系.它是一种容器框架,用于创建bean,维护bean之间 ...