复习几乎考不到的树剖。维护min以及min个数,打set和add标记即可,注意set优先级优于add。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=1e5+,INF=0x7f7f7f7f;
struct thxorz{int to,nxt;}G[N<<];
int Head[N],tot;
int n,q;
inline void Addedge(int x,int y){
G[++tot].to=y,G[tot].nxt=Head[x],Head[x]=tot;
G[++tot].to=x,G[tot].nxt=Head[y],Head[y]=tot;
}
#define y G[j].to
int fa[N],son[N],topfa[N],st[N],dep[N],cnt,sonc[N];
void dfs1(int x,int f){
int tmp=-;sonc[x]=;fa[x]=f,dep[x]=dep[f]+;
for(register int j=Head[x];j;j=G[j].nxt)if(y^f)dfs1(y,x),sonc[x]+=sonc[y],MAX(tmp,sonc[y])&&(son[x]=y);
}
void dfs2(int x,int topf){
topfa[x]=topf,st[x]=cnt++;if(!son[x])return;dfs2(son[x],topf);//order the point in dfs2,not in dfs1.
for(register int j=Head[x];j;j=G[j].nxt)if((y^fa[x])&&(y^son[x]))dfs2(y,y);
}
#undef y
#define lc i<<1
#define rc i<<1|1
#define all 1,1,n-1
int minv[N<<],mint[N<<],stag[N<<],atag[N<<];
inline void Pushup(int i){
if(minv[lc]<minv[rc])mint[i]=mint[lc];
else mint[i]=minv[lc]>minv[rc]?mint[rc]:mint[lc]+mint[rc];
minv[i]=_min(minv[lc],minv[rc]);
}
inline void Pushdown(int i,int L,int R){
if(~stag[i]){
minv[lc]=minv[rc]=stag[i]+atag[i];
atag[lc]=atag[rc]=atag[i],stag[lc]=stag[rc]=stag[i];
mint[lc]=(L+R>>)-L+,mint[rc]=R-(L+R>>);
stag[i]=-,atag[i]=;
}
else{
minv[lc]+=atag[i],minv[rc]+=atag[i];
atag[lc]+=atag[i],atag[rc]+=atag[i];
atag[i]=;
}
}
void Build(int i,int L,int R){
if(L==R){mint[i]=,stag[i]=-;return;}
int mid=L+R>>;Build(lc,L,mid),Build(rc,mid+,R),Pushup(i),stag[i]=-;
}
void Update_set(int i,int L,int R,int ql,int qr,int c){
if(ql<=L&&qr>=R){minv[i]=c,mint[i]=R-L+,stag[i]=c,atag[i]=;return;}
int mid=L+R>>;Pushdown(i,L,R);
if(ql<=mid)Update_set(lc,L,mid,ql,qr,c);
if(qr>mid)Update_set(rc,mid+,R,ql,qr,c);
Pushup(i);
}
void Update_add(int i,int L,int R,int ql,int qr,int c){
if(ql<=L&&qr>=R){minv[i]+=c,atag[i]+=c;return;}
int mid=L+R>>;Pushdown(i,L,R);
if(ql<=mid)Update_add(lc,L,mid,ql,qr,c);
if(qr>mid)Update_add(rc,mid+,R,ql,qr,c);
Pushup(i);
}
int Query_min(int i,int L,int R,int ql,int qr){//dbg(i),dbg(ql),dbg(qr),dbg(minv[i]);
if(ql<=L&&qr>=R)return minv[i];
int mid=L+R>>,ret=INF;Pushdown(i,L,R);
if(ql<=mid)MIN(ret,Query_min(lc,L,mid,ql,qr));
if(qr>mid)MIN(ret,Query_min(rc,mid+,R,ql,qr));
return ret;
}
inline void Tree_set(int x,int y,int c){
while(topfa[x]^topfa[y]){
if(dep[topfa[x]]<dep[topfa[y]])swap(x,y);//dbg(x);dbg(y);
Update_set(all,st[topfa[x]],st[x],c);x=fa[topfa[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x^y)Update_set(all,st[x]+,st[y],c);
}
inline int Tree_min(int x,int y){
int ret=INF;
while(topfa[x]^topfa[y]){
if(dep[topfa[x]]<dep[topfa[y]])swap(x,y);//dbg(x),dbg(st[topfa[x]]),dbg(st[x]);
MIN(ret,Query_min(all,st[topfa[x]],st[x]));x=fa[topfa[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x^y)MIN(ret,Query_min(all,st[x]+,st[y]));
return ret;
}
inline void Tree_add(int x,int y,int c){
int minx=Tree_min(x,y);//dbg(minx);
if(minx+c<)c=-minx;
while(topfa[x]^topfa[y]){
if(dep[topfa[x]]<dep[topfa[y]])swap(x,y);
Update_add(all,st[topfa[x]],st[x],c);x=fa[topfa[x]];
}
if(dep[x]>dep[y])swap(x,y);
if(x^y)Update_add(all,st[x]+,st[y],c);
}
int main(){//freopen("3.in","r",stdin);freopen("test.ans","w",stdout);
read(n);read(q);
for(register int i=,x,y;i<n;++i)read(x),read(y),Addedge(x,y);
dfs1(,);dfs2(,);Build(all);//for(register int i=1;i<=n;++i)cout<<i<<" ",dbg(st[i]);
for(register int i=,opt,x,y,c;i<=q;++i){
read(opt),read(x),read(y),read(c);
if(opt==)Tree_set(x,y,c);
else Tree_add(x,y,c);
printf("%d\n",!minv[]?mint[]:);
}
return ;
}

BZOJ4353 Play with tree[树剖]的更多相关文章

  1. SP375 QTREE - Query on a tree (树剖)

    题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...

  2. CF 504 E —— Misha and LCP on Tree —— 树剖+后缀数组

    题目:http://codeforces.com/contest/504/problem/E 快速查询LCP,可以用后缀数组,但树上的字符串不是一个序列: 所以考虑转化成序列—— dfs 序! 普通的 ...

  3. hdu_5274_Dylans loves tree(树剖)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5274 题意:给一棵树和叶子的值,然后有单点修改操作和询问区间操作,询问的是每一个值出现的奇偶次数,如果 ...

  4. SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)

    You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...

  5. SPOJ375Query on a tree I(树剖+线段树)(询问边)

    ιYou are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  6. POJ3237 Tree(树剖+线段树+lazy标记)

    You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...

  7. 2019.01.19 codeforces343D.Water Tree(树剖+ODT)

    传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...

  8. 【树剖】CF916E Jamie and Tree

    好吧这其实应该不是树剖... 因为只要求子树就够了,dfs就好了 大概就是记录一个全局根root 多画几幅图会发现修改时x,y以root为根时的lca为以1为根时的lca(x,y),lca(root, ...

  9. SPOJ 375 Query on a tree 树链剖分模板

    第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...

随机推荐

  1. 论文阅读 | ERNIE: Enhanced Representation through Knowledge Integration

    摘要 知识加强的语义表示模型. knowledge masking strategies  :  entity-level  masking   / phrase-level masking    实 ...

  2. iterm 2快捷键

    快捷键 作用说明 command + f 搜索&查找,如果输入搜索内容后,按下 tab 键,就会 iTerm 自动帮选中搜索关键词,并且自动的帮我们复制到了剪贴板中.如果输入的是 shift+ ...

  3. 【转帖】Office的光荣历史(1)

    Office的光荣历史(1) https://www.sohu.com/a/201410882_657550 微软的第一版本的office 竟然是 给Mac OS 提供的.. 2017-10-31 1 ...

  4. Oracle-DQL 5- 分组函数(多行函数)

    分组函数(多行函数):--针对表中的多行数据进行运算,返回一个结果 1.多行函数 --sum() 求和SELECT SUM(sal) FROM emp; --avg() 求平均值SELECT AVG( ...

  5. laravel-admin关联查询问题解决办法

    文档是这么说的: 按照文档上来,没有成功,网上找了好久,说是没有在模型中关联,关联之后的运行结果是这样的: 还是没有成功啊,仔细研究返现是这里写错了,whereHas后面跟的是model中的方法名,而 ...

  6. Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法

    切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...

  7. 【原创】大数据基础之Chronos

    官方:https://mesos.github.io/chronos/ mesos集群中替换crontab Chronos A fault tolerant job scheduler for Mes ...

  8. python之数字类型小知识

    数字是表示计数的抽象事物,也是数学运算和推理的基础,所以,生活中数字是生活中无处不在的,那么,在python语言中运用数字有哪些小知识呢,不妨花点时间看一下这篇博文,牢记这些小知识. 整数类型中四种进 ...

  9. Ubuntu12.04+Caffe (+OpenCV+CPU-only)

    经过一天的努力发现12.04 的pcre的库太低了,   要解决这个bug只能升级系统到16.04   麻蛋!!! 1.  下载大神MTCNN 源码,内含caffe https://github.co ...

  10. vue进阶:vuex(数据池)

    非父子组件传值 vuex 一.非父子组件传值 基于父子组件通信与传值实现非父子组件传值的示例关键代码: <template> <div> <!-- 学员展示 --> ...