博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.09.16 bzoj3626: [LNOI2014]LCA(树链剖分)
阅读量:4365 次
发布时间:2019-06-07

本文共 2007 字,大约阅读时间需要 6 分钟。

树链剖分好题。
对于每个点维护一个值vivi,当考虑点i时我们将它到根的路径上的所有数的v值+1。
这样维护下来v和dep的值是相等的。
当这个更新到达点i时,从1到z这条路径的v值之和就是ij=1dep[lca(j,z)]∑j=1idep[lca(j,z)]
这样的话一个询问(l,r,z)可以转化成calc(1,r,z)-calc(1.l-1,z)。
这样就可以离线用树剖维护了。
代码:

#include
#define lc (p<<1)#define rc (p<<1|1)#define mid (T[p].l+T[p].r>>1)#define N 50005#define mod 201314using namespace std;int n,m,first[N],dep[N],top[N],hson[N],fa[N],siz[N],num[N],cnt=0,tot=0,sig=0,ans[N];struct edge{
int v,next;}e[N<<1];struct Q{
int id,pos,tmp,z;}q[N<<1];struct Node{
int l,r,sum,lz;}T[N<<2];inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}inline void dfs1(int p){ siz[p]=1; for(int i=first[p];i;i=e[i].next){ int v=e[i].v; dep[v]=dep[p]+1,dfs1(v),siz[p]+=siz[v]; if(siz[v]>siz[hson[p]])hson[p]=v; }}inline void dfs2(int p,int tp){ top[p]=tp,num[p]=++sig; if(!hson[p])return; dfs2(hson[p],tp); for(int i=first[p];i;i=e[i].next){ int v=e[i].v; if(v!=hson[p])dfs2(v,v); }}inline void pushup(int p){T[p].sum=(T[lc].sum+T[rc].sum)%mod;}inline void pushnow(int p,int v){(T[p].sum+=v*(T[p].r-T[p].l+1))%=mod,(T[p].lz+=v)%=mod;}inline void pushdown(int p){
if(T[p].lz)pushnow(lc,T[p].lz),pushnow(rc,T[p].lz),T[p].lz=0;}inline void build(int p,int l,int r){ T[p].l=l,T[p].r=r; if(l==r)return; build(lc,l,mid),build(rc,mid+1,r);}inline void update(int p,int ql,int qr,int v){ if(ql>T[p].r||qr
mid)update(rc,ql,qr,v); else update(lc,ql,mid,v),update(rc,mid+1,qr,v); pushup(p);}inline int query(int p,int ql,int qr){ if(ql>T[p].r||qr
mid)return query(rc,ql,qr); return (query(lc,ql,mid)+query(rc,mid+1,qr))%mod;}inline void change(int x,int y,int v){ while(top[x]!=top[y]){ if(dep[top[x]]

转载于:https://www.cnblogs.com/ldxcaicai/p/9738260.html

你可能感兴趣的文章
说说面向对象
查看>>
mybatis学习笔记
查看>>
使用淘宝 NPM 镜像
查看>>
zabbix 乱码的问题
查看>>
Swift 学习之二十一:?和 !(详解)
查看>>
Laravel
查看>>
二分图匹配
查看>>
Day032--Python--操作系统, process进程
查看>>
highcharts-Highmaps 动态传入城市名称
查看>>
english interview
查看>>
寒假222_codeforces 290 div 2 D
查看>>
open-falcon(v0.2)部署手册(源码编译)
查看>>
大明A+B(hdu1753)大数,java
查看>>
局部变量&&malloc函数&&生命周期的一些见解
查看>>
springboot打jar包,调用webservice出错
查看>>
一审七个月了
查看>>
xth的旅行(codevs 1450)
查看>>
sql 表有没有自增列,插入自增列值
查看>>
php ajax请求判断
查看>>
sqlserver 行列旋转
查看>>