http://www.lydsy.com/JudgeOnline/problem.php?id=3589

树链剖分

用线段数维护扫描线的方式来写,标记只打不下传

#include<cstdio>
#include<iostream>
#include<algorithm> #define N 200001 using namespace std;
int n; int front[N],to[N<<],nxt[N<<],tot; int siz[N],dep[N],fa[N];
int bl[N],in[N],out[N]; int sum[N<<],f[N<<];
int ans[N<<],tag[N<<]; int op[][]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} void dfs1(int x,int y)
{
siz[x]=;
for(int i=front[x];i;i=nxt[i])
{
if(to[i]==fa[x]) continue;
fa[to[i]]=x;
dep[to[i]]=dep[x]+;
dfs1(to[i],x);
siz[x]+=siz[to[i]];
}
} void dfs2(int x,int top)
{
bl[x]=top;
in[x]=++tot;
int y=;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && siz[to[i]]>siz[y]) y=to[i];
if(!y) { out[x]=tot; return;}
dfs2(y,top);
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && to[i]!=y) dfs2(to[i],to[i]);
out[x]=tot;
} void down(int k,int l,int mid,int r)
{
sum[k<<]+=f[k]*(mid-l+);
sum[k<<|]+=f[k]*(r-mid);
f[k<<]+=f[k];
f[k<<|]+=f[k];
f[k]=;
} void add(int k,int l,int r,int opl,int opr,int w)
{
if(l>=opl && r<=opr)
{
sum[k]+=(r-l+)*w;
f[k]+=w;
return;
}
int mid=l+r>>;
if(f[k]) down(k,l,mid,r);
if(opl<=mid) add(k<<,l,mid,opl,opr,w);
if(opr>mid) add(k<<|,mid+,r,opl,opr,w);
sum[k]=sum[k<<]+sum[k<<|];
} void add_tag(int k,int l,int r,int opl,int opr,bool w)
{
if(l>=opl && r<=opr)
{
if(w) tag[k]++,ans[k]=sum[k];
else tag[k]--,ans[k]=;
return;
}
int mid=l+r>>;
if(f[k]) down(k,l,mid,r);
if(opl<=mid) add_tag(k<<,l,mid,opl,opr,w);
if(opr>mid) add_tag(k<<|,mid+,r,opl,opr,w);
if(!tag[k]) ans[k]=ans[k<<]+ans[k<<|];
else ans[k]=sum[k];
} void solve(int u,int v,bool ty)
{
while(bl[u]!=bl[v])
{
if(dep[bl[u]]<dep[bl[v]]) swap(u,v);
add_tag(,,n,in[bl[u]],in[u],ty);
u=fa[bl[u]];
}
if(dep[u]>dep[v]) swap(u,v);
add_tag(,,n,in[u],in[v],ty);
} int main()
{
freopen("data.in","r",stdin);
freopen("my.out","w",stdout);
read(n);
int u,v;
for(int i=;i<n;++i)
{
read(u); read(v);
add(u,v);
}
dfs1(,);
tot=;
dfs2(,);
int m;
read(m);
int ty;
while(m--)
{
read(ty);
if(!ty)
{
read(u); read(v);
add(,,n,in[u],out[u],v);
}
else
{
read(ty);
for(int i=;i<=ty;++i)
{
read(op[i][]); read(op[i][]);
solve(op[i][],op[i][],);
}
if(ans[]<) ans[]+=(1LL<<);
cout<<ans[]<<'\n';
for(int i=;i<=ty;++i) solve(op[i][],op[i][],);
}
}
}

bzoj千题计划214:bzoj3589: 动态树的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...

  3. bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count

    http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...

  4. bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色

    http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...

  5. bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...

  6. bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...

  7. bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...

  8. bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)

    https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...

  9. bzoj千题计划319:bzoj2865: 字符串识别(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #inc ...

随机推荐

  1. 【python学习笔记】7.更加抽象

    [python学习笔记]7.更加抽象 类的定义就是执行代码块 在内存保存一个原始实例,可以通过类名来访问 类的实例化,是创建一个原始实例的副本, 并且所有成员变量与原始实例绑定 通过修改实例变量,可以 ...

  2. WCF服务寄宿到IIS

    一.WCF简介: Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的wind ...

  3. java序列化浅谈

    首先大家进来第一个疑问肯定是"什么是序列化?为什么要使用序列化?怎么实现一个简单的序列化案例?" 1.序列化就是把对象以一种规范的二进制形式存在内存中,另一边以反序列化方式获取: ...

  4. 对thinkphp的命名空间的理解

    tp的命名空间其实就是虚拟目录,目的是为了自动加载类(不是管理文件) tp命名空间包含两部分: (1)初始命名空间:Library (2)根命名空间: a)Library文件下的所有文件夹,只含一级文 ...

  5. 【django之博客系统开发】

    一.项目简介 使用django开发一套博客系统,参考博客园. 需求如下: 项目结构: 二.全部代码 from django.db import models # Create your models ...

  6. jQuery学习笔记之extend方法小结

    在学习jQuery的时候,学习到了$.extend的主要用法,在此做一个简单的总结. (1)当只写一个对象自变量时,拓展的是jQuery的工具方法,如: $.extend({ aaa:function ...

  7. Mycat 分片规则详解--取模范围分片

    实现方式:该算法先进行取模,然后根据取模值所属范围进行分片 优点:可以自主决定取模后数据的节点分布 缺点:dataNode 划分节点是事先建好的,需要扩展时比较麻烦. 配置示例: <tableR ...

  8. from提交表单后 数据提交到后台 但不跳转页面 可用iframe

    可以页面事先加载被隐藏的iframe标签,或者等到需要的时候通过js生成,再提交,提交之前,form的target指向iframe(我是要实现新页面生成的时候程半透明状态,所以用了后者的方法) 代码如 ...

  9. linux截取字符串之sort、uniq、cut用法

    sort命令是帮我们依据不同的数据类型进行排序 参 数:  -b   忽略每行前面开始出的空格字符.  -c   检查文件是否已经按照顺序排序.  -f   排序时,忽略大小写字母.  -M   将前 ...

  10. Repeating Decimals UVA - 202

    The / repeats indefinitely with no intervening digits. In fact, the decimal expansion of every ratio ...