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 ;
}

;

最新文章

  1. c#如何判断webbrowser已经加载完毕
  2. 提取本地环境中部署RDLC的DLL
  3. SharePoint 2010 文档管理系列
  4. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
  5. c#如实现将一个数字转化为其他进制字符串输出
  6. linux shell 命令学习(5) xxd- make a hexdump or do the reverse.
  7. QQ网站如何检测对本地已经登录的qq用户
  8. java基础-浅复制与深复制的理解
  9. Codeforces Testing Round #12 B. Restaurant 贪心
  10. 电商平台如何接入快递鸟电子面单API?
  11. Nginx - Core Module Directives
  12. golang-mongodb范例
  13. C# 第三方控件 下面的Item不显示了
  14. 《java.util.concurrent 包源码阅读》22 Fork/Join框架的初体验
  15. APP安全--网络传输安全 AES/RSA/ECC/MD5/SHA
  16. UE4 Xml读写
  17. Testlink1.7.5安装部署
  18. 强化学习(三)用动态规划(DP)求解
  19. 玩玩小程序:使用 WebApi 交互打造原生的微信小程序 - 图灵小书架
  20. Extjs renderer函数

热门文章

  1. Webpack 4 Tree Shaking 终极优化指南
  2. 大宇java面试系列(一):jvm垃圾回收
  3. [剑指offer]删除链表中重复的结点(把重复的都删掉,1个不留)
  4. python:collections模块
  5. 扛把子组Scrum立会报告+燃尽图 07
  6. Selenium网页自动登录项目(基于Python从0到1)
  7. python接口自动化测试——简单的文件上传代码实现,人人网登陆后上传图片举例
  8. 在vue中选中某个标签,并且对其属性进行操作
  9. php之自动加载(懒加载)
  10. 安装软件包的三种方法、RPM包介绍、rpm、yum工具用法、yum搭建本地仓库