Max Mex

题目地址:https://codeforces.com/contest/1084/problem/F

然后合并时注意分情况讨论:


参考代码:
 #include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define mkp make_pair
#define fi first
#define se second
typedef long long ll;
typedef pair<int,int> PII;
const int INF=0x3f3f3f3f;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
const int maxn=2e5+;
int n,q,typ,x,y,cnt,ans;
int a[maxn],in[maxn],out[maxn];
int dep[maxn],fc[],fa[][maxn];
vector<int> G[maxn];
PII res; inline void dfs(int u)
{
in[u]=++cnt;
for(int i=;fc[i]<=dep[u];++i) fa[i][u]=fa[i-][fa[i-][u]];
for(int i=,len=G[u].size();i<len;++i)
{
dep[G[u][i]]=dep[u]+;fa[][G[u][i]]=u;
dfs(G[u][i]);
}
out[u]=++cnt;
} inline int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=,t=dep[x]-dep[y];t;++i)
if(t&fc[i]) x=fa[i][x],t^=fc[i];
for(int i=;~i;--i) if(fa[i][x]^fa[i][y])
x=fa[i][x],y=fa[i][y];
return x==y? x:fa[][x];
} namespace Segment
{
#define ls (rt<<1)
#define rs (rt<<1|1)
PII T[maxn<<]; bool anc(int x,int y){return in[x]<=in[y]&&out[x]>=out[y];} PII check(PII x,int y)
{
if(!x.fi || !y) return mkp(,);
if(anc(x.fi,x.se)) swap(x.fi,x.se);
if(anc(x.se,x.fi))
{
if(anc(x.fi,y)) return mkp(y,x.se);
if(anc(x.se,y))
{
if(anc(y,x.fi)) return x;
if(LCA(x.fi,y)==x.se) return mkp(x.fi,y);
return mkp(,);
}
return mkp(y,x.fi);
} if(anc(x.fi,y)) return mkp(y,x.se);
if(anc(x.se,y)) return mkp(x.fi,y);
if(!anc(LCA(x.fi,x.se),y)) return mkp(,);
if(!anc(y,x.fi) && !anc(y,x.se)) return mkp(,);
return x;
} PII merge(PII x,PII y)
{
if(x.fi==-) return y;
x=check(x,y.fi);x=check(x,y.se);
return x;
} void update(int rt,int l,int r,int pos,int x)
{
if(l==r){T[rt]=mkp(x,x);return ;}
int mid=l+r>>;
if(pos<=mid) update(ls,l,mid,pos,x);
else update(rs,mid+,r,pos,x);
T[rt]=merge(T[ls],T[rs]);
} bool query(int rt,int l,int r)
{
PII tmp=merge(res,T[rt]);
if(tmp.fi){res=tmp;ans=r;return true;}
if(l==r) return false;//
int mid=l+r>>;
if(query(ls,l,mid)) query(rs,mid+,r);
return false;
}
}
using namespace Segment; int main()
{
n=read(); fc[]=;
for(int i=;i<=n;++i) a[i]=read()+;
for(int i=;i<=n;++i) G[read()].pb(i);
for(int i=;i<=;++i) fc[i]=fc[i-]<<;
dfs();
for(int i=;i<=n;++i) update(,,n,a[i],i);
q=read();
while(q--)
{
typ=read();
if(typ==)
{
x=read();y=read();swap(a[x],a[y]);
update(,,n,a[x],x);update(,,n,a[y],y);
}
else
{
res=mkp(-,);ans=;query(,,n);
printf("%d\n",ans);
}
} return ;
}

;

CF 526F Max Mex(倍增求LCA+线段树路径合并)的更多相关文章

  1. [51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树)

    [51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树) 题面 给出一棵N个点的树,Q次询问一点编号在区间[l1,r1]内,另一点编号在区间[l2,r2]内的所有点对距离最大值.\ ...

  2. CF 519E(树上倍增求lca)

    传送门:A and B and Lecture Rooms 题意:给定一棵树,每次询问到达点u,v距离相等的点有多少个. 分析:按情况考虑: 1.abs(deep[u]-deep[v])%2==1时, ...

  3. 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)

    洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...

  4. 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))

    倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...

  5. [学习笔记] 树上倍增求LCA

    倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...

  6. 树上倍增求LCA(最近公共祖先)

    前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...

  7. [算法]树上倍增求LCA

    LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...

  8. 【倍增】洛谷P3379 倍增求LCA

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  9. hdu 2586 How far away ? 倍增求LCA

    倍增求LCA LCA函数返回(u,v)两点的最近公共祖先 #include <bits/stdc++.h> using namespace std; *; struct node { in ...

随机推荐

  1. pxe批量部署

    功能: 批量全自动安装操作系统方法: dhcp 自动分配IP tftp 微系统 用来安装系统 httpd 网络源 操作流程: #检查环境 getenforce #检查selinux systemctl ...

  2. JAVA 调用HTTP接口POST或GET实现方式

    HTTP是一个客户端和服务器端请求和应答的标准(TCP),客户端是终端用户,服务器端是网站.通过使用Web浏览器.网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请 ...

  3. PowerMock学习(一)之PoweMock的入门--模拟新增学生操作

    关于powermock 在TDD领域Mock框架有很多,比如EasyMock,JMock,Mockito.可能有些同学会好奇了,为什么要重点把powermock拿出来呢,因为powermock可以解决 ...

  4. 【Linux系列】Centos 7安装以及网络配置(一)

    目的 本文主要介绍以下两点: 一. 如何在Oracle VM VirtualBox安装centos(已有VirtualBox) 二. 如何在内网里实现虚拟机访问外网.物理主机以及物理主机访问虚拟机 一 ...

  5. 一次shardingjdbc踩坑引起的胡思乱想

    项目里面的一个分表用到了sharding-jdbc 当时纠结过是用mycat还是用sharding-jdbc的, 但是最终还是用了sharding-jdbc, 原因如下: 1. mycat比较重, 相 ...

  6. 架构设计:"4+1"视图

    概念 "4+1"视图,是指从5个不同视角来描述软件体系结构. "4+1"分别指: 逻辑视图 过程视图 物理视图 开发视图 场景/用例 视图 逻辑架构的描述可以围 ...

  7. lufylegend.js教程(1)

    1.图片元素如何缩小? 在LSprite类中,有两个属性:{scaleX,scaleY},这两个属性属于按比例缩放精灵对象,可以放大,可以缩小,注意这两个属性是在图片中心点位置开始缩放. 代码: Bo ...

  8. 回声消除中的LMS和NLMS算法与MATLAB实现

    自适应滤波是数字信号处理的核心技术之一,在科学和工业上有着广泛的应用领域.自适应滤波技术应用广泛,包括回波抵消.自适应均衡.自适应噪声抵消和自适应波束形成.回声对消是当今通信系统中普遍存在的现象.声回 ...

  9. nyoj 208 + poj 1456 Supermarket (贪心)

    Supermarket 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 A supermarket has a set Prod of products on sal ...

  10. python:利用celery分布任务

    Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单.celery看起来似乎很庞大.celery适用异步处理问题,当发送邮件.或者文件上传, 图像处理等等一些比较 ...