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);
}
}
}
BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA的更多相关文章
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
- BZOJ 4771: 七彩树 可持久化线段树+树链的并
这个思路挺有意思的 ~ 利用树链的并来保证每个颜色只贡献一次,然后用可持久化线段树维护 code: #include <set> #include <cstdio> #incl ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- BZOJ 3439 Kpm的MCpassword Trie树+可持久化线段树
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那 ...
- [TS-A1505] [清橙2013中国国家集训队第二次作业] 树 [可持久化线段树,求树上路径第k大]
按Dfs序逐个插入点,建立可持久化线段树,每次查询即可,具体详见代码. 不知道为什么,代码慢的要死,, #include <iostream> #include <algorithm ...
随机推荐
- 大牛blog
分布式: 分布式基础学习[一] —— 分布式文件系统 分布式基础学习[二] —— 分布式计算系统(Map/Reduce) Java分布式应用技术架构介绍
- 安全提示:IIS不要开启“WebDAV”扩展(转载)
在IIS设置里,有一个“Web服务扩展”的设置,其中包括“WebDAV”扩展.许多人都不明白,这个“WebDAV”扩展是干嘛用的,要不要开启呢?有不少人的想法是“开启吧,以免影响网站运行,启用总比不启 ...
- pycharm shortcut
Alt+F12 is a shortcut to open/hide Terminal panel
- TopShelf 自动配置Service测试
在开发中经常会遇到后台定时处理数据和任务的情况,处理这些事情大概有以下几种方案: 1.使用数据库的job功能.优点是在数据库中可以完成的就在数据库中完成,配置等基础设施数据库都提供,简单快捷.缺点是如 ...
- 【转】浅谈JavaScript中forEach与each
forEach是ES5中操作数组的一种方法,主要功能是遍历数组,例如: var arr = [1,2,3,4]; arr.forEach(alert); 等价于: var arr = [1, 2, 3 ...
- 解决RobotFramework的关键字不能高亮的问题
一个可能的原因:路径中存在汉字,RobotFramework对这方面运行的不太好.
- SSL踩坑ERR_SSL_VERSION_OR_CIPHER_MISMATCH
最近公司项目开发了一个微信小程序,并且部署测试OK,由于微信小程序调用的后端接口必须是HTTPS,所以给接口安装了SSL,第一天测试都正常.第二天早上再使用时页面无响应. 抓包发现是后端接口抛出: n ...
- 个人java框架 技术分析
1.框架选型 spring-boot https://github.com/JeffLi1993/springboot-learning-example https://mp.weixin.qq.co ...
- Zabbix监控系统部署:源码安装
1. 概述1.1 基础环境2. 部署过程2.1 创建用户组2.2 下载源码解压编译安装2.2.1 下载源码解压2.2.2 YUM安装依赖环境2.2.3 编译安装最新版curl2.2.4 更新GNU构建 ...
- nginx下目录浏览及其验证功能、版本隐藏等配置记录
工作中常常有写不能有网页下载东西的需求,在Apache下搭建完成后直接导入文件即可达到下载/显示文件的效果;而Nginx的目录列表功能默认是关闭的,如果需要打开Nginx的目录列表功能,需要手动配置, ...