BZOJ 4448 主席树+树链剖分(在线)
为什么题解都是离线的…… (抄都没法抄)
搞一棵主席树
1 操作 新树上的当前节点设成1
2 操作 查max(i-xx-1,0)那棵树上这条路径上有多少个点是1
让你找经过了多少个点 查的时候用deep 搞出来就好了
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 444444
#define mem(x,y) memset(x,y,sizeof(x))
int n,q,op,xx,yy,zz,first[N],v[N],next[N],tot,root,rt[N],ans;
int size[N],fa[N],son[N],deep[N],top[N],change[N],back[N],cnt;
struct Tree{int l,r,num;}tree[N*30];
void Add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void add(int x,int y){Add(x,y),Add(y,x);}
void dfs(int x){
size[x]=1;
for(int i=first[x];~i;i=next[i])if(v[i]!=fa[x]){
deep[v[i]]=deep[x]+1,fa[v[i]]=x,dfs(v[i]);
size[x]+=size[v[i]];
if(size[son[x]]<size[v[i]])son[x]=v[i];
}
}
void dfs2(int x,int tp){
change[x]=++cnt,back[cnt]=x;top[x]=tp;
if(son[x])dfs2(son[x],tp);
for(int i=first[x];~i;i=next[i])
if(v[i]!=fa[x]&&v[i]!=son[x])dfs2(v[i],v[i]);
}
void push_up(int pos){tree[pos].num=tree[tree[pos].l].num+tree[tree[pos].r].num;}
int build(int l,int r){
int pos=++cnt;
if(l==r){return pos;}
int mid=(l+r)>>1;
tree[pos].l=build(l,mid),tree[pos].r=build(mid+1,r);
return pos;
}
int insert(int o,int l,int r,int num){
int pos=++cnt;tree[pos]=tree[o];
if(l==r){tree[pos].num=1;return pos;}
int mid=(l+r)>>1;
if(mid>=num)tree[pos].l=insert(tree[o].l,l,mid,num);
else tree[pos].r=insert(tree[o].r,mid+1,r,num);
push_up(pos);return pos;
}
int query(int o,int l,int r,int L,int R){
if(l>=L&&r<=R)return tree[o].num;
int mid=(l+r)>>1;
if(mid<L)return query(tree[o].r,mid+1,r,L,R);
else if(mid>=R)return query(tree[o].l,l,mid,L,R);
else return query(tree[o].l,l,mid,L,R)+query(tree[o].r,mid+1,r,L,R);
}
int find(int x,int y,int wei){
int fx=top[x],fy=top[y],temp=0;
while(fx!=fy){
if(deep[fx]<deep[fy])swap(x,y),swap(fx,fy);
temp+=query(rt[wei],1,n,change[fx],change[x]),ans+=deep[x]-deep[fx]+1;
x=fa[fx],fx=top[x];
}
if(deep[x]<deep[y])swap(x,y);
ans+=deep[x]-deep[y]+1;
return temp+query(rt[wei],1,n,change[y],change[x]);
}
int main(){
mem(first,-1);scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&fa[i]);
if(!fa[i])root=i;else add(i,fa[i]);
}
dfs(root),dfs2(root,root),cnt=0,rt[0]=build(1,n);
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d",&op);
if(op==1){
rt[i]=rt[i-1],ans=0;
scanf("%d%d%d",&xx,&yy,&zz);
zz=max(i-zz-1,0);
printf("%d %d\n",ans,find(xx,yy,zz));
}
else scanf("%d",&xx),rt[i]=insert(rt[i-1],1,n,change[xx]);
}
}
BZOJ 4448 主席树+树链剖分(在线)的更多相关文章
- bzoj 4448 [Scoi2015]情报传递 (树链剖分+主席树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4448 题面: Description 奈特公司是一个巨大的情报公司,它有着庞大的情报网络 ...
- 线段树&数链剖分
傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...
- bzoj 3252: 攻略 -- 长链剖分+贪心
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MB Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神 ...
- bzoj 3252 攻略 长链剖分思想+贪心
攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 889 Solved: 423[Submit][Status][Discuss] Descrip ...
- BZOJ 4448: [Scoi2015]情报传递 树链剖分 主席树
4448: [Scoi2015]情报传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4448 Description 奈特公司是一个巨 ...
- UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...
- [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分
题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
- CF487E Tourists 圆方树、树链剖分
传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...
随机推荐
- 一步一步跟我学习hadoop(7)----hadoop连接mysql数据库运行数据读写数据库操作
为了方便 MapReduce 直接訪问关系型数据库(Mysql,Oracle).Hadoop提供了DBInputFormat和DBOutputFormat两个类.通过DBInputFormat ...
- Struts2学习(四)利用ajax异步上传
上一篇说到怎样在struts2中进行上传下载.我们使用了struts的标签通过表单提交的方式,但大家知道表单提交会造成页面总体的刷新,这样的方式很不友好,那我们今天就来说说怎样结合ajax方式进行异步 ...
- Oracle在更改机器名后服务无法启动的解决方法
Oracle改变机器名后会导致服务无法正常启动,能够通过下列操作解决: 1.oracle\product\10.2.0\db_3\network\ADMIN文件夹下,listener.ora文件里的L ...
- CSS3可伸缩框属性,可用于等分显示子元素或按比例显示子元素的大小
使用方法跟Android的android:layout_weight属性类似.可类比Android中的使用方法.这样比較好记,因为眼下全部浏览器都不支持大部分的属性,所以全部的属性都须要加上Firef ...
- java web 服务器端处理json格式参数
前面我们说了传递参数的两种访书,第一是key-value形式,第二是json格式,对于第一种我们在服务器端直接使用 request.getParameter("key");就能获取 ...
- 四种GCC内置位运算函数
int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比方7368(1110011001000)返回4. int __builtin_clz (u ...
- WebRTC代码走读(八):代码文件夹结构
转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包含线程.锁.socket等 ├── ./build //编译脚本.gyp ├── ./ ...
- [jzoj 5930] [NOIP2018模拟10.26】山花 解题报告 (质因数分类)
题目链接: http://172.16.0.132/senior/#contest/show/2538/2 题目: 小S决定从某一个节点$u$开始对其子树中与$u$距离小于$K$的节点代表的花树进行采 ...
- OC冒泡排序算法
面试的时候很多公司会要求写一个冒泡排序算法,于是用OC写了一个,代码如下所示 需要注意的事项:oc数组只能存放oc对象,因此遍历数组输出的时候,记得通过NSString对象转换成intValue #i ...
- sql server Delete误操作后如何恢复数据
声明:本文是根据别人的经验https://blog.csdn.net/dba_huangzj/article/details/8491327写的总结 说明:update和delete时没有加where ...