复习几乎考不到的树剖。维护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. Hadoop集群搭建-04安装配置HDFS

    Hadoop集群搭建-05安装配置YARN Hadoop集群搭建-04安装配置HDFS  Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hado ...

  2. 20190507-学习dubbo有感于梁飞

    “作为一名程序员,BAT肯定是大多数人都想进的,仿佛是一种情愫,就像学生时代的我们对清华北大的向往感觉一样.Dubbo团队中,其中主要负责人就是梁飞了,梁飞的经历还是蛮励志的.梁飞,花名虚极, 200 ...

  3. java水题集

    POJ - 1220 进制转换 import java.io.*; import java.util.*; import java.math.*; public class Main { public ...

  4. python-day7(正式学习)

    目录 数字类型内置方法 整形内置方法(int) 常用操作+内置方法 是否可变 浮点型内置方法(float) 常用操作+内置方法 是否可变 字符串内置方法 常用操作+内置方法 是否可变 数字类型内置方法 ...

  5. python中property属性的介绍及其应用

    Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...

  6. Redis服务端相关

    全局命令: 查看所有键: keys * 键总数: dbsize 检查键是否存在: exists key 删除键: del key [key...] 键过期: expire key seconds 键的 ...

  7. mysql45讲

    一共48讲,学习时间2天. 开篇词 (1讲) 开篇词 | 这一次,让我们一起来搞懂MySQL 理论指导实践:先系统性的学习原理,再实践验证. 你可以从点到线再到面,形成自己到mysql知识网络. 在使 ...

  8. 使用SQL语句查询Elasticsearch索引数据

    Elasticsearch 的官方查询语言是 Query DSL,存在毕竟有存在的道理,存在即合理.SQL 作为一个数据库查询语言,它语法简洁,书写方便而且大部分服务端程序员都清楚了解和熟知它的写法. ...

  9. springcloud(十二)-springcloud-config统一管理微服务配置

    1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...

  10. Guava动态调用方法

    前言 大家在Coding的时候,经常会遇到这样一个情况,根据不同的条件去执行对应的代码.我们通常的处理方式是利用if-else判断,或者直接switch-case,特别是jdk1.6之后,swith开 ...