BZOJ4353 Play with tree[树剖]
复习几乎考不到的树剖。维护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[树剖]的更多相关文章
- SP375 QTREE - Query on a tree (树剖)
题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...
- CF 504 E —— Misha and LCP on Tree —— 树剖+后缀数组
题目:http://codeforces.com/contest/504/problem/E 快速查询LCP,可以用后缀数组,但树上的字符串不是一个序列: 所以考虑转化成序列—— dfs 序! 普通的 ...
- hdu_5274_Dylans loves tree(树剖)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5274 题意:给一棵树和叶子的值,然后有单点修改操作和询问区间操作,询问的是每一个值出现的奇偶次数,如果 ...
- 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 ...
- SPOJ375Query on a tree I(树剖+线段树)(询问边)
ιYou are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- 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 ...
- 2019.01.19 codeforces343D.Water Tree(树剖+ODT)
传送门 ODTODTODT板子题. 支持子树01覆盖,路径01覆盖,询问一个点的值. 思路:当然可以用树剖+线段树,不过树剖+ODTODTODT也可以很好的水过去. 注意修改路径时每次跳重链都要修改. ...
- 【树剖】CF916E Jamie and Tree
好吧这其实应该不是树剖... 因为只要求子树就够了,dfs就好了 大概就是记录一个全局根root 多画几幅图会发现修改时x,y以root为根时的lca为以1为根时的lca(x,y),lca(root, ...
- SPOJ 375 Query on a tree 树链剖分模板
第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...
随机推荐
- layui 第三方组件 eleTree 树组件 树形选择器
使用 JS位置 ,layui/lay/modules/eleTree.js:CSS位置 ,layui/css/modules/eleTree/eleTree.css: ## 下面应用即可页面css引用 ...
- java 8 Base64用法
Java 8的java.util套件中,新增了Base64的类别,可以用来处理Base64的编码与解码,用法如下: final Base64.Decoder decoder = Base64.getD ...
- CentOS学习之NTP服务配置详解
详解centos7下ntp服务配置 一.ntp服务是什么 1.定义 NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 2.发展 首次记载在 ...
- linux 静态库 ar命令用法
当我们的程序中有经常使用的模块,而且这种模块在其他程序中也会用到,这时按照软件重用的思想,我们应该将它们生成库,使得以后编程可以减少开发代码量.这里介绍命令ar,用来对库操作. 1.ar基本用法 ar ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- layui时间显示
第一次使用layui框架吧!记录layui踩到的坑! 个人洁癖,不太喜欢显示时分秒. 最后终于找到解决方案了! 代码如下: {field: 'ctime',title: '时间',templet:&q ...
- Elasticsearch5.x安装及常见错误的解决方法
Elasticsearch是基于java开发的,机器上必须要先java环境,elasticsearch5.x建议用jdk8的最新版本.下面介绍elasticsearch5.x的安装步骤: 一.安装El ...
- Lua 截取字符串(截取utf-8格式字符串)
对utf-8完全没概念的可以看看我上一篇随笔:简单说说utf-8编码格式 另外,还要知道string.sub 和 string.byte 的用法. 先上完整代码: local StringHelper ...
- ui组件库
基于Vue的Quasar Framework 中文网 http://www.quasarchs.com/ quasarframework/quasar: Quasar Frameworkhttps:/ ...
- 3 java 笔记
1 垃圾回收机制能够很好地提高编程效率 2 垃圾回机制保护程序的完成性 3 面向对象的三种基本特征:继承,封装,多态 4 面向对象的方式:OOA(面向对象的分析),OOD(面向对象的设计)和OOP(面 ...