CF 526F Max Mex(倍增求LCA+线段树路径合并)
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+线段树路径合并)的更多相关文章
- [51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树)
[51nod 1766]树上的最远点对 (树的直径+ST表求lca+线段树) 题面 给出一棵N个点的树,Q次询问一点编号在区间[l1,r1]内,另一点编号在区间[l2,r2]内的所有点对距离最大值.\ ...
- CF 519E(树上倍增求lca)
传送门:A and B and Lecture Rooms 题意:给定一棵树,每次询问到达点u,v距离相等的点有多少个. 分析:按情况考虑: 1.abs(deep[u]-deep[v])%2==1时, ...
- 【题解】洛谷P4180 [BJWC2010] 严格次小生成树(最小生成树+倍增求LCA)
洛谷P4180:https://www.luogu.org/problemnew/show/P4180 前言 这可以说是本蒟蒻打过最长的代码了 思路 先求出此图中的最小生成树 权值为tot 我们称这棵 ...
- 倍增求LCA学习笔记(洛谷 P3379 【模板】最近公共祖先(LCA))
倍增求\(LCA\) 倍增基础 从字面意思理解,倍增就是"成倍增长". 一般地,此处的增长并非线性地翻倍,而是在预处理时处理长度为\(2^n(n\in \mathbb{N}^+)\ ...
- [学习笔记] 树上倍增求LCA
倍增这种东西,听起来挺高级,其实功能还没有线段树强大.线段树支持修改.查询,而倍增却不能支持修改,但是代码比线段树简单得多,而且当倍增这种思想被应用到树上时,它的价值就跟坐火箭一样,噌噌噌地往上涨. ...
- 树上倍增求LCA(最近公共祖先)
前几天做faebdc学长出的模拟题,第三题最后要倍增来优化,在学长的讲解下,尝试的学习和编了一下倍增求LCA(我能说我其他方法也大会吗?..) 倍增求LCA: father[i][j]表示节点i往上跳 ...
- [算法]树上倍增求LCA
LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4 ...
- 【倍增】洛谷P3379 倍增求LCA
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- hdu 2586 How far away ? 倍增求LCA
倍增求LCA LCA函数返回(u,v)两点的最近公共祖先 #include <bits/stdc++.h> using namespace std; *; struct node { in ...
随机推荐
- css的块级元素和行级元素
块级元素 概念: 每个块级元素都是独自占一行. 元素的高度.宽度.行高和边距都是可以设置的. 元素的宽度如果不设置的话,默认为父元素的宽度(父元素宽度100%) <address>/ ...
- UML简明使用
1.继承 空心三角+实线 2.实现接口 空心三角+虚线 3.关联 箭头+实线 4.聚合 空心菱形+实线+箭头 5.组合 实心菱形+实线+箭头 6.依赖 虚线+箭头 7.关联.聚合.组合.依赖的区别 关 ...
- Ubuntu字符界面与图形界面的切换
1.按ALT+CTRL+F1切换到字符界面 2.按ALT+CTRL+F7切换到图形界面
- Spring Boot2 系列教程(二十四)Spring Boot 整合 Jpa
Spring Boot 中的数据持久化方案前面给大伙介绍了两种了,一个是 JdbcTemplate,还有一个 MyBatis,JdbcTemplate 配置简单,使用也简单,但是功能也非常有限,MyB ...
- 基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm)
基于Windows下永久破解jetbrains公司的系列产品(Idea, pycharm,clion,phpstorm): PS : 有能力的建议购买正版,好吧. PS:均针对其对应的2018.3.1 ...
- MAC系统下,Jmeter5.1.1 无法录制问题
问题一: 点击[start]先出现一个检查证书信息的弹窗,确保删除旧的安装新的,并且需要信任证书 (一般证书只需要信任一下即可,每次启动都会有这个弹窗提醒) 问题二: MAC OS系统使用Jmeter ...
- Java描述设计模式(22):策略模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 每年双十一,各大电商平台会推出不同的满减策略,当用户的消费金额满一定额度后,会进行减去一定的优惠额度,从而来一波清仓甩卖,使用策 ...
- 基于Vue的日历组件
可以标注重要日子 自己写的,可能不是特别很好,大家多提意见!!! 地址:https://github.com/jsLWQ/calendar
- vue常用指令总结
一.vue指令 官网解释 指令 (Directives) 是带有 v- 前缀的特殊特性.指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况).指令的职责是,当表达式的值改变 ...
- 万恶之源-python加深
1.列表 1.1列表的含义: 它是以[]括起来,每个元素用""引起来,用逗号隔开而且可以存放各种类型的数据. li=["樊大爷",王立军",&qu ...