bzoj4353: Play with tree
Description
Input
Output
#include<cstdio>
#include<algorithm>
typedef long long i64;
const int N=;
const i64 fil_0=1ll<<;
char buf[],*ptr=buf-;
int _(){
int x=,c=*++ptr,f=;
while(c<)c=='-'&&(f=-),c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
int n,m,es[N*],enx[N*],e0[N],ep=,ans=;
int fa[N],sz[N],dep[N],top[N],son[N],id[N],idp=;
int _l,_r;
i64 _a;
struct node{
node*lc,*rc;
i64 mn,fil,a;
int L,R,mc;
int c0(){
return mn?:mc;
}
void _fil(i64 x){
mn=fil=x;
mc=R-L+;
a=;
}
void _add(i64 x){
if(fil!=fil_0)fil+=x;
mn+=x;a+=x;
}
void fils(){
if(_l<=L&&R<=_r){
_fil(_a);
return;
}
dn();
int M=L+R>>;
if(_l<=M)lc->fils();
if(_r>M)rc->fils();
up();
}
void mns(){
if(mn>=_a)return;
if(_l<=L&&R<=_r){
_a=mn;
return;
}
dn();
int M=L+R>>;
if(_l<=M)lc->mns();
if(_r>M)rc->mns();
}
void adds(){
if(_l<=L&&R<=_r){
_add(_a);
return;
}
dn();
int M=L+R>>;
if(_l<=M)lc->adds();
if(_r>M)rc->adds();
up();
}
void dn(){
if(a){
lc->_add(a);
rc->_add(a);
a=;
}
if(fil!=fil_0){
lc->_fil(fil);
rc->_fil(fil);
fil=fil_0;
}
}
void up(){
mn=lc->mn<rc->mn?lc->mn:rc->mn;
mc=;
if(mn==lc->mn)mc+=lc->mc;
if(mn==rc->mn)mc+=rc->mc;
}
}ns[N*],*np=ns,*rt[N];
node*build(int L,int R){
node*w=np++;
w->L=L;w->R=R;
if(L!=R){
int M=L+R>>;
w->lc=build(L,M);
w->rc=build(M+,R);
w->up();
}else{
w->mn=;w->mc=;
w->fil=fil_0;
}
return w;
}
#define F(a,b) ans-=a->c0(),a->b(),ans+=a->c0()
void fils(int x,int y,i64 c){
int a=top[x],b=top[y];
_a=c;
while(a!=b){
if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
_l=id[a],_r=id[x];
F(rt[a],fils);
x=fa[a];a=top[x];
}
if(dep[x]>dep[y])std::swap(x,y);
_l=id[x]+,_r=id[y];
if(_l<=_r)F(rt[top[x]],fils);
}
void mns(int x,int y,i64 c){
int a=top[x],b=top[y];
_a=c;
while(a!=b){
if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
_l=id[a],_r=id[x];
rt[a]->mns();
x=fa[a];a=top[x];
}
if(dep[x]>dep[y])std::swap(x,y);
_l=id[x]+,_r=id[y];
if(_l<=_r)rt[top[x]]->mns();
}
void adds(int x,int y,i64 c){
mns(x,y,-c);
_a*=-;
int a=top[x],b=top[y];
while(a!=b){
if(dep[a]<dep[b])std::swap(a,b),std::swap(x,y);
_l=id[a],_r=id[x];
F(rt[a],adds);
x=fa[a];a=top[x];
}
if(dep[x]>dep[y])std::swap(x,y);
_l=id[x]+,_r=id[y];
if(_l<=_r)F(rt[top[x]],adds);
}
void f1(int w,int pa){
dep[w]=dep[fa[w]=pa]+;
sz[w]=;
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=pa){
f1(u,w);
sz[w]+=sz[u];
if(sz[u]>sz[son[w]])son[w]=u;
}
}
}
void f2(int w,int tp){
top[w]=tp;
id[w]=++idp;
if(son[w])f2(son[w],tp);
else rt[tp]=build(id[tp],id[w]);
for(int i=e0[w];i;i=enx[i]){
int u=es[i];
if(u!=fa[w]&&u!=son[w])f2(u,u);
}
}
int main(){
buf[fread(buf,,sizeof(buf),stdin)]=;
n=_();m=_();
for(int i=,a,b;i<n;++i){
a=_();b=_();
es[ep]=b;enx[ep]=e0[a];e0[a]=ep++;
es[ep]=a;enx[ep]=e0[b];e0[b]=ep++;
}
f1(,);f2(,);
ans=n-;
for(int i=,o,u,v,c;i<m;++i){
o=_();u=_();v=_();c=_();
if(o==)fils(u,v,c);
else adds(u,v,c);
printf("%d\n",ans);
}
return ;
}
bzoj4353: Play with tree的更多相关文章
- BZOJ4353 Play with tree[树剖]
复习几乎考不到的树剖.维护min以及min个数,打set和add标记即可,注意set优先级优于add. #include<iostream> #include<cstdio> ...
- 【BZOJ-4353】Play with tree 树链剖分
4353: Play with tree Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 31 Solved: 19[Submit][Status][ ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- SAP CRM 树视图(TREE VIEW)
树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...
- 无限分级和tree结构数据增删改【提供Demo下载】
无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...
- 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode 笔记 100 - Same Tree
题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...
- Leetcode 笔记 99 - Recover Binary Search Tree
题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...
随机推荐
- ZOJ 1609 Equivalence(状压+dfs减枝)
ZOJ Problem Set - 1609 Equivalence Time Limit: 5 Seconds Memory Limit: 32768 KB When learning m ...
- python爬虫之性能相关
性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): ...
- 【转】OpenWRT开发自定义应用方法
[转]OpenWRT开发自定义应用方法 转自:http://blog.csdn.net/rudyn/article/details/38616783 OpenWRT编译成功完成后,所有的产品都会放在编 ...
- QT 相关书籍
qt qucik 核心编程 个人觉得此书写得非常之好....这位作者的另外一本虽然没看过,估计也不错 https://bbs.csdn.net/topics/390942701?list=lz qt5 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- 新浪云使用smarty模板的方法
在部署到sina app engine(sae)上时出现了问题,因为sae作为云计算平台式无法进行文件读写操作的,所以Smarty中输出的缓存文件就无法实现. 错误信息:“SAE_Fatal_erro ...
- sql server不能删除数据库,显示错误:正在使用
解决办法: use mastergoalter database database_name set single_user with rollback immediate --将数据库回滚到原始配置 ...
- U盘传送容量与格式问题
问题 今天想将7.6G的文件拷到U盘里,提示u盘内存不足,其实内存为14+G. 解答 U盘格式对于U盘的传送大小有限制 下面为U盘三种不同格式的应用及优缺点 FAT32格式:为系统默认格式,具有极佳的 ...
- [sklearn]性能度量之AUC值(from sklearn.metrics import roc_auc_curve)
原创博文,转载请注明出处! 1.AUC AUC(Area Under ROC Curve),即ROC曲线下面积. 2.AUC意义 若学习器A的ROC曲线被学习器B的ROC曲线包围,则学习器B的性能优于 ...
- vc 编译器的一些精典报错
本篇将平时遇到的一些编译错误 , 记录于此 , 同时帖上分析