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 ...
随机推荐
- (转)利用Beautiful Soup去抓取p标签下class=jstest的内容
1.利用Beautiful Soup去抓取p标签下class=jstest的内容 import io import sys import bs4 as bs import urllib.request ...
- [转帖]注解机制(Annotation,区别于comment)
[19/04/16-星期二] 注解机制(Annotation,区别于comment(传统意义上的注释)) 一.概念 作用: ——不是程序本身,可以对程序作出解释.(这一点和注释没什么区别) ——可 ...
- 安装laravel框架
方式一:Windows版本通过composer来下载安装laravel框架 一:laravel是php的一个web框架.laravel框架安装主要依赖composer工具,本经验就介绍一下怎么在win ...
- drf框架的模块分析
请求模块 请求模块是个什么鬼 ''' 1.drf的request是在wsgi的request基础上再次封装 2.wsgi的request作为drf的request一个属性:_request 3.新的r ...
- Redis-数据结构与对象-对象
1. 作用 Redis使用对象作为五种不同类型的底层实现,字符串,列表,哈希,集合,有序集合等 而对象是基于之前的分析的数据结构创建的.每个对象都至少用到一种数据结构,这意味着,Redis五大类型,底 ...
- VirtualBox网络之仅主机(Host-Only)网络
https://blog.csdn.net/dkfajsldfsdfsd/article/details/79441874
- Java 注解(原理及其使用)
一.注解(annotation)介绍 Java在JDK5中引入源代码的注解机制. 1.什么是注解? 注解为代码添加了元数据,元数据是关于数据的组织.数据域及其关系的说明信息. 更通俗的说,注解为程序元 ...
- C# 反射遍历对象所有属性
[TestMethod] public void Test6() { List<RepaymentRecord> repaymentList = new List<Repayment ...
- Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
其实原因很简单,就是翻译的结果 匿名内部类和局部内部类只能引用外部的fianl变量 把变量变成fianl就行了 第一次知道啊 记小本本.......
- sql server存储过程回滚事务
SET NOCOUNT ON这个很常用 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息. 当SET ONCOUNT ON时候,不返回计数,当SET NOCOUNT OFF时候, ...