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 ...
随机推荐
- Spark安装和简单示例
spark的安装 先到官网下载安装包 注意第二项要选择和自己hadoop版本相匹配的spark版本,然后在第4项点击下载.若无图形界面,可用windows系统下载完成后传送到centos中. 本例中安 ...
- C# 处理 JSON 常用的帮助类
C#请求接口的方法,具体代码: 首先需要添加引用和第三方的组件,具体如下: 引用命名空间: using System.IO; using Newtonsoft.Json.Linq; using Sys ...
- QMainWindow: No such file or directory 问题的解决方法
这种问题往往是由于QT4的程序转换到QT5所导致的,在.pro文件中加上一句 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 就可以解决问题
- Memcached 补充
Memcached 补充 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站 ...
- H265 Profile & Level & Tier 介绍
H265/HEVC Profile Level Tier 档次.水平.等级 为了提供不同应用之间的兼容互通,HEVC/H265 定义了不同的编码 Profile 档次.Level 水平.Tier 等级 ...
- FairyGUI编辑器制作Unity3D UI值得借鉴
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...
- HTML字符实体(Character Entities),转义字符串(Escape Sequence) 转
为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...
- Windows下使用CMake进阶
目录 回顾代码工程中有什么 将需要的东西在cmake脚本CMakeLists.txt中申明 一键型编译 使用nmake 使用msbuild 实现一键编译 参考 在CMake入门实践一文中,我们初略的介 ...
- 在 Visual Studio中 使用Apache Cordova 开发安卓、iOS程序(自定义图标和闪屏)
方法1 1台安装有linux的电脑,虚拟机也行,并安装imagemagick软件包.我用的是linux mint,直接在软件管理器中安装即可 把https://github.com/shamork/c ...
- Django项目部署(阿里云)(1)--基本功能实现
新博客地址:http://muker.net/django-server.html 手头需要部署一个Django项目,前面的博客也因为偷懒也没有部署,这里记录一下部署过程.ps:其实网上比较靠谱的说明 ...