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 ...
随机推荐
- volatile关键字解析(一)
引起线程并发问题,可以简单的总结为以下三条: 原子性问题 可见性问题 有序性问题(重排序问题) 原子性问题 什么是原子性? 原子性,即一个操作或者多个操作,要么全部执行并且执行过程中不会被任何因素打断 ...
- 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法
SQL SERVER数据库进行备份时出现“操作系统错误5(拒绝访问).BACKUP DATABASE 正在异常终止.”错误.我们应该如何解决这个问题?小编今天为大家推荐一个解决办法. 一般备份文件选择 ...
- Java之JVM逃逸分析
引言: 逃逸分析(Escape Analysis)是众多JVM技术中的一个使用不多的技术点,本文将通过一个实例来分析其使用场景. 概念 逃逸分析,是一种可以有效减少Java 程序中同步负载和内存堆分配 ...
- libcurl使用认证证书 https认证
在server.xml中增加下面的内容: ciphers="SSL_RSA_WITH_RC4_128_SHA" 下面是libcurl 的测试代码: #include <std ...
- redis常用配置参数解析
本文主要总结一下redis常用的配置参数的用法: 以下参数决定redis运行方式,默认前台运行,修改为yes可以让redis以后台守护进程方式运行 daemonize no 以下参数指定redis的p ...
- 细说C语言的优先级和结合性
Table0. 为什么要掌握优先级1. 优先级1.1 优先级图表1.2 运算符实例1.3 优先级顺口溜2. 结合性3. 参考资料 写代码的时候,常会翻看的一个表就是“c语言运算符优先级表”.c的运算符 ...
- 使用jenkins持续集成自动化测试
本文采用Springboot开发一个简易的添加个人资料和查询个人资料接口,并采用testng进行测试,使用jenkis进行持续继承,allure输出测试报告. 个人资料查询接口开发(集成H2数据库) ...
- erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”
如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...
- Session学习
Session学习 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通 ...
- 正则同时获取a标签里的href,text 2项
Regex regex2 = new Regex(@"<a[^>]+href=\s*(?:'(?<href>[^']+)'|""(?<hre ...