注意赋值和加法的标记下传优先级.具体看代码.

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: 月下“毛景树” (树链剖分+线段树)的更多相关文章

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

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

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

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

  3. BZOJ 1984月下“毛景树” LCT维护边权 + 下传标记

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

  4. BZOJ 1984 月下“毛景树”

    我觉得我要把BZOJ上的链剖写完了吧.... #include<iostream> #include<cstdio> #include<cstring> #incl ...

  5. 【BZOJ】1984 月下“毛景树”

    [算法]树链剖分+线段树 [题解]线段树的区间加值和区间覆盖操作不能同时存在,只能存在一个. 修改:从根节点跑到目标区域路上的标记全部下传,打完标记再上传回根节点(有变动才需要上传). 询问:访问到目 ...

  6. BZOJ.1758.[WC2010]重建计划(分数规划 点分治 单调队列/长链剖分 线段树)

    题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深 ...

  7. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  8. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  9. BZOJ 3672[NOI2014]购票(树链剖分+线段树维护凸包+斜率优化) + BZOJ 2402 陶陶的难题II (树链剖分+线段树维护凸包+分数规划+斜率优化)

    前言 刚开始看着两道题感觉头皮发麻,后来看看题解,发现挺好理解,只是代码有点长. BZOJ 3672[NOI2014]购票 中文题面,题意略: BZOJ 3672[NOI2014]购票 设f(i)f( ...

随机推荐

  1. mysql --explain+slowlog

    一.EXPALIN 在SQL语句之前加上EXPLAIN关键字就可以获取这条SQL语句执行的计划 那么返回的这些字段是什么呢? 我们先关心一下比较重要的几个字段: 1. select_type 查询类型 ...

  2. Find Duplicate File in System

    Given a list of directory info including directory path, and all the files with contents in this dir ...

  3. Jboss: Using reverse path on top path: /xxx

    环境 jboss 5.2 原因 加载资源的协议错误.一般在加载文件的时候,URL 都是以 file: 开头,但是在 jboss 上时,由于其虚拟化了路径,导致协议不一致,并且找不到外部的配置文件. 分 ...

  4. 初识numpy库

    numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型.多维数组上执行数值运算 numpy创建数组(矩阵): numpy中的数据类型: ...

  5. PDO原生分页

    ** PDO分页** 1.PDO连接数据库 $dbh=new PDO('mysql:host=127.0.0.1;dbname=03a','root','root');//使用pdo 2.接收页码 $ ...

  6. Yii2.0 组件

    框架之所以是框架,是因为其强大,其封装了很多实用的功能,开发者可以开箱即用. 下边列举Yii2.0的部分组件: var_dump(Yii::$app->session->getId()); ...

  7. python3列表、元组

    列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作.列表中的每个元素都分配一个数字也就是它的位置,或叫索引,第一个索引是0,第二个索引是1,依此类推. ...

  8. 使用tqdm实现下载文件进度条

    1.获取下载链接 下载链接为:http://fastsoft.onlinedown.net/down/Fcloudmusicsetup2.5.5.197764.exe 2.使用tqdm实现 2.1.从 ...

  9. 树莓派和STM32通过USB和串口通信记录

    不管怎样,为了简便开发,通信选择串口通信. 推荐文章:https://blog.csdn.net/magnetoooo/article/details/53564797 推荐测试工具:https:// ...

  10. mysql解决fail to open file的方法

    由于没有安装有mysql的可视化工具,在使用cmd导入sql文件时,使用source 命令时出现 fail to open file的错误,各种查找后使用以下方法解决了: 1.首先进入mysql数据库 ...