复习几乎考不到的树剖。维护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. intellij idea for mac 2018 破解版

    下载地址:https://pan.baidu.com/s/1DNo3CvkI7EMy6Mt0hdzTpg 1.在本站下载好mac文件包,打开dmg镜像文件,将“IntelliJ IDEA”拖入到“Ap ...

  2. 微信JSAPI支付接口,支付完成后关闭当前窗口

    一.把demo里的这一段: success: function (res) { // 支付成功后的回调函数 if (res.err_msg == "get_brand_wcpay_reque ...

  3. NIKKEI Programming Contest 2019-2 Task D. Shortest Path on a Line

    Observations ① 从 $1$ 到 $N$ 的最短路一定是不走回头路的.所谓走回头路是指从序号大的点走到序号小的点. 证明:首先,任意从 $1$ 到 $N$ 的路径的最后一步一定不是回头路. ...

  4. Linux命令-文件管理篇-cat

    1.cat 说明 cat 是一个文本文件查看和连接工具.查看一个文件的内容,用cat比较简单,就是cat 后面直接接文件名. 2.使用权限 所有使用者 <!-- more --> 3.ca ...

  5. 高性能MySQL3_笔记0

    该书2015年5月出版的,实际上已经有些老了,但是经典的东西还是经典. 该书一共16章 1.Mysql的架构与历史 2.Mysql基准测试 3.服务器性能剖析 4.Schema与数据类型优化 5.创建 ...

  6. Lua格式讲解

    firstValue = "This is a string value"; -- 这是一个变量的定义,变量定义不需要任何标记,这个是全局变量 print("helloW ...

  7. Android获取网络时间的方法

    一.通过免费或者收费的API接口获取 1.免费 QQ:http://cgi.im.qq.com/cgi-bin/cgi_svrtime 淘宝:http://api.m.taobao.com/rest/ ...

  8. API接口利用ActionFilterAttribute实现接口耗时检测

    1.主要代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; ...

  9. (四)创建基于maven的javaFX+springboot项目,用户界面与后台逻辑分离方式

    下面来介绍创建maven的javaFX+springboot项目,基于用户界面与后天逻辑分离的方式,用户界面使用fxml文件来常见,类似于jsp,可以引入css文件修饰界面 maven依赖 <d ...

  10. java实现spark常用算子之mapPartitionsWithIndex

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...