bzoj千题计划214:bzoj3589: 动态树
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: 动态树的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划146:bzoj3295: [Cqoi2011]动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 正着删除看做倒着添加 对答案有贡献的数对满足以下3个条件: 出现时间:i<=j 权值大小 ...
- bzoj千题计划124:bzoj1036: [ZJOI2008]树的统计Count
http://www.lydsy.com/JudgeOnline/problem.php?id=1036 树链剖分板子题 #include<cstdio> #include<iost ...
- bzoj千题计划275:bzoj4817: [Sdoi2017]树点涂色
http://www.lydsy.com/JudgeOnline/problem.php?id=4817 lct+线段树+dfs序 操作1:access 操作2:u到根的-v到根的-lca到根的*2+ ...
- bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...
- bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...
- bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
https://www.lydsy.com/JudgeOnline/problem.php?id=3173 插入的数是以递增的顺序插入的 这说明如果倒过来考虑,那么从最后一个插入的开始删除,不会对以某 ...
- bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆 ...
- bzoj千题计划319:bzoj2865: 字符串识别(后缀自动机 + 线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #inc ...
随机推荐
- 2.3.2 InnoDB内存
前面介绍了一些InnoDB的体系架构(http://www.cnblogs.com/tanwt/p/8530987.html) 接下来介绍一下InnoDB 的内存 1.缓冲池 首先我们需要了解的是In ...
- Luogu P1410 子序列
题目大意: 给定一个长度为\(N\)(\(N\)为偶数)的序列,] 问能否将其划分为两个长度为\(\frac{N}{2}\)的严格递增子序列, 输入一共有\(50\)组数据,每组数据保证\(N \le ...
- [Luogu3527][POI2011]MET-Meteors
BZOJ权限题!提供洛谷链接! sol 昨晚突发奇想去学了一下整体二分. 这道题应该算是整体二分的板子题吧. 整体二分 首先要求可离线,不然还是安心码数据结构吧. 整体二分简单的来讲,就是时间复杂度可 ...
- angular路由详解六(路由守卫)
路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...
- 大数据(2):基于sogou.500w.utf8数据hive的实践
一.环境的搭建 1.安装配置mysql rpm –ivh MySQL-server-5.6.14.rpm rpm –ivh MySQL-client-5.6.14.rpm 启动mysql 创建hive ...
- jQuery对于动态生成的元素绑定无效的问题~~
问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...
- JDK配置及tomcat部署
JDK配置及tomcat部署 2017-09-30-17:54:03 个人原创博客,转载请注明出处,作者,否则依法追究责任,文中引用了一些百度经验的图片,特此注明. 一,配置JDK:1.8.0_66版 ...
- 记kkpager分页控件的使用
kkpager支持异步加载分页: 1.页面添加div标签和引用JS,默认标签为<div id="kkpager"></div> 引用JS和样式 <sc ...
- linux学习之路--(四)文件,目录管理
1.mkdir:创建空目录 -p: -v:verbose mkdir -pv /mnt/test/x/m /mnt/test/y mkdir -pv /mnt/test/{x/m,y} 命令行展开: ...
- 20165226 预备作业3 Linux安装及学习
20165226 预备作业3 Linux安装及学习 Linux安装 一.下载安装VirtualBox 1.首先在官网下载,点开基于VirtualBox虚拟机安装Ubuntu图文教程 找到版本进行下载安 ...