BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA
输入
输出
样例输入
5 8
1 3 3 2 2
1 1 3 3
1 0
0 0
3 0
1 3
2 1
2 0
6 2
4 1
样例输出
2
3
1
1
2
1
1
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int T;
int n,m;
int x,y;
int cnt;
int tot;
int num;
int ans;
int s[100010];
int t[100010];
int a[100010];
int d[100010];
int v[100010];
int to[100010];
int que[100010];
int ls[5000010];
int rs[5000010];
int next[100010];
int head[100010];
int sum[5000010];
int root[100010];
int f[100010][19];
set<int>q[100010];
set<int>::iterator it;
bool cmp(int x,int y)
{return d[x]<d[y];
}
void add(int x,int y)
{tot++;next[tot]=head[x];head[x]=tot;to[tot]=y;
}
int lca(int x,int y)
{if(d[x]<d[y]){swap(x,y);}int dep=d[x]-d[y];for(int i=0;i<=18;i++){if((dep&(1<<i))!=0){x=f[x][i];}}if(x==y){return x;}for(int i=18;i>=0;i--){if(f[x][i]!=f[y][i]){x=f[x][i];y=f[y][i];}}return f[x][0];
}
void dfs(int x)
{s[x]=++cnt;que[cnt]=x;for(int i=1;i<=18;i++){f[x][i]=f[f[x][i-1]][i-1];}for(int i=head[x];i;i=next[i]){d[to[i]]=d[x]+1;dfs(to[i]);}t[x]=cnt;
}
int updata(int pre,int l,int r,int k,int v)
{int rt=++cnt;if(l==r){sum[rt]=sum[pre]+v;return rt;}ls[rt]=ls[pre];rs[rt]=rs[pre];sum[rt]=sum[pre]+v;int mid=(l+r)>>1;if(k<=mid){ls[rt]=updata(ls[pre],l,mid,k,v);}else{rs[rt]=updata(rs[pre],mid+1,r,k,v);}return rt;
}
int query(int rt,int l,int r,int L,int R)
{if(!rt||(L<=l&&r<=R)){return sum[rt];}int mid=(l+r)>>1;if(L>mid){return query(rs[rt],mid+1,r,L,R);}else if(R<=mid){return query(ls[rt],l,mid,L,R);}else{return query(ls[rt],l,mid,L,R)+query(rs[rt],mid+1,r,L,R);}
}
int main()
{scanf("%d",&T);while(T--){tot=0;ans=0;cnt=0;num=0;memset(head,0,sizeof(head));memset(root,0,sizeof(root));memset(f,0,sizeof(f));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&v[i]);a[i]=i;q[i].clear();}for(int i=2;i<=n;i++){scanf("%d",&f[i][0]);add(f[i][0],i);}d[1]=1;dfs(1);sort(a+1,a+1+n,cmp);for(int i=1;i<=n;i++){x=y=0;it=q[v[a[i]]].lower_bound(s[a[i]]);root[d[a[i]]]=updata(root[d[a[i-1]]],1,n,s[a[i]],1);if(it!=q[v[a[i]]].end()){y=que[(*it)];root[d[a[i]]]=updata(root[d[a[i]]],1,n,s[lca(a[i],y)],-1);}if(it!=q[v[a[i]]].begin()){it--;x=que[(*it)];root[d[a[i]]]=updata(root[d[a[i]]],1,n,s[lca(a[i],x)],-1);}if(x&&y){root[d[a[i]]]=updata(root[d[a[i]]],1,n,s[lca(x,y)],1);}q[v[a[i]]].insert(s[a[i]]);}for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);x^=ans;y^=ans;ans=query(root[min(d[x]+y,d[a[n]])],1,n,s[x],t[x]);printf("%d\n",ans);}}
}
转载于:https://www.cnblogs.com/Khada-Jhin/p/9449125.html
BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA相关推荐
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- 主席树 - 可持久化线段树
模板 P3834 [模板]可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc++.h> using namespace std; #de ...
- Codeforces1422 F.Boring Queries(根号分治+线段树+可持久化线段树)
题意: 解法: 如果问题可以离线,那么莫队可以直接冲过去,可惜离不得. 每个数最多只有一个>sqrt的质因子,sqrt(2e5)<90, 开90棵线段树分别维护前90个质因子的区间最大指数 ...
- 主席树 || 可持久化线段树 || LCA || BZOJ 2588: Spoj 10628. Count on a tree || Luogu P2633 Count on a tree...
题面: Count on a tree 题解: 主席树维护每个节点到根节点的权值出现次数,大体和主席树典型做法差不多,对于询问(X,Y),答案要计算ans(X)+ans(Y)-ans(LCA(X,Y) ...
- bzoj 4771: 七彩树 树链的并+可持久化线段树
题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. ...
- SP10628 COT - Count on a tree (树剖+可持久化线段树)
题意: 给定一个包含 N 个结点的树. 树节点从 1 到 N编号..每个节点有一个整数权值. 我们会要求您执行以下操作: u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值 输入 在 ...
- 解题报告:P3834 【模板】可持久化线段树 2(主席树)详解
P3834 [模板]可持久化线段树 2(主席树) 题解 P3834 [[模板]可持久化线段树 2(主席树)] 1)静态求第k大数 可持久化线段树,不能用堆的方法存子结点了,所以用指针l表示左儿子r表示 ...
- 可持久化线段树——主席树
前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- 【模板】可持久化线段树 1(主席树)
题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...
最新文章
- 什么是pretext tasks?
- SSM整合框架实现ajax校验
- Cucumber入门之_argument
- FPGA图案--数字表示(代码+波形)
- 重磅!谷歌大脑提出EfficientNet平衡模型扩展三个维度,取得精度-效率的最大化!...
- Java线程 生产者--消费者模式总结(二)
- 计算机导论的计算题,计算机导论复习题(选择部分)汇总
- FortiClient cannot establish caused by TLS version
- 阻滞增长模型求解_阻滞增长模型logistic模型.ppt
- 树莓派人脸表情识别中期报告
- 不知道读什么?5种方法教你打造私房书单!
- 索骥馆-编程语言之《网络编程实用教程(第2版)》扫描版[PDF]
- 【开源项目】Imagine图片压缩工具
- 27岁女生零基础转行学软件测试,来的及吗,我陷入了迷茫......
- 教你写一个ftp协议(文件传输协议)
- 联想MIIX 510-12ISK 改Win7系统
- uefi装完系统后无法引导_戴尔DELL电脑重装win10开机启动不了无法引导解决方法...
- 某程序员工作一年感慨:看到代码就恶心,想转行销售,网友:你觉得人民币恶心吗?
- 计算机cpu组装图,组装电脑CPU安装和跳线接法(图文收藏)
- 专注HR 招聘SaaS市场,Moka还有多少上升空间?
热门文章
- 如何给拍好的短视频配音?最简单的方法推荐!
- ★如何解释特修斯之船问题?
- 相机内存卡照片删除怎么恢复
- 教你用Python如何完成一个查票系统实现123006自动抢票啦~
- python 下载mp4视频 实例
- Leetcode 905. Sort Array By Parity
- 学生请销假管理系统java_学生请假管理系统.doc
- typescript入门之:如何使用、不限定函数参数的个数传参、interface约束(对象、函数、数组、类)、定义可选参数
- 软件测试-软件测试总结
- 计算机术语中的channel,English 中关于道路方面用词之(4)—Channel, Tunnel