Max Mex
无法直接处理
可以二分答案!
[0,mid]是否在同一个链上?
可以不修改地做了
修改?
能不能信息合并?可以!
记录包含[l,r]的最短链的两端
可以[0,k][k+1,mid]合并:枚举四个端点中的两个,使得另外两个一定在这两个的路径上
(判断z点在x,y路径上:(lca(x,z)==z||lca(y,z)=z)&&(lca(lca(x,y),z)=lca(x,y))画图即可理解
能合并,所以线段树可以维护。
线段树维护
线段树上二分。
LCA用ST表存
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=2e5+;
int n,q;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int dep[N];
int a[*N],tot;
int dfn[N];
int f[*N][];
int lg[*N];
int id[N],fid[N];
void dfs(int x,int d){
dep[x]=d;
a[++tot]=x;
dfn[x]=tot;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
dfs(y,d+);
a[++tot]=x;
}
}
int big(int x,int y){
return dep[x]<dep[y]?x:y;
}
int lca(int x,int y){
if(dfn[x]>dfn[y]) swap(x,y);
int len=lg[dfn[y]-dfn[x]+];
return big(f[dfn[x]][len],f[dfn[y]-(<<len)+][len]);
}
int on(int p1,int p2,int p3){
int y=lca(p1,p2);
// cout<<" p1 "<<p1<<" p2 "<<p2<<" p3 "<<p3<<" y "<<y<<endl;
return ((lca(p1,p3)==p3||lca(p2,p3)==p3)&&(lca(y,p3)==y));
}
struct tr{
int p[];
int can;
void init(){
can=p[]=p[]=;
}
void op(){
cout<<" can "<<can<<" p[0] "<<p[]<<" p[1] "<<p[]<<endl;
}
}t[*N];
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
void pushup(int x){
t[x].init();
if(t[x<<].can&&t[x<<|].can){
t[x].can|=on(t[ls].p[],t[ls].p[],t[rs].p[])&&on(t[ls].p[],t[ls].p[],t[rs].p[]);
if(t[x].can==) {t[x].p[]=t[ls].p[],t[x].p[]=t[ls].p[];return;}
t[x].can|=on(t[rs].p[],t[rs].p[],t[ls].p[])&&on(t[rs].p[],t[rs].p[],t[ls].p[]);
if(t[x].can==) {t[x].p[]=t[rs].p[],t[x].p[]=t[rs].p[];return;}
if(!t[x].can){
for(reg i=;i<=;++i){
for(reg j=;j<=;++j){
t[x].can|=on(t[ls].p[i],t[rs].p[j],t[ls].p[i^])&&on(t[ls].p[i],t[rs].p[j],t[rs].p[j^]);
if(t[x].can==) {t[x].p[]=t[ls].p[i],t[x].p[]=t[rs].p[j];return;}
}
}
}
}
}
tr merge(tr A,tr B){
tr C;C.can=C.p[]=C.p[]=;
// cout<<" A ";A.op();
// cout<<" B ";B.op();
if(A.can&&B.can){
C.can|=on(A.p[],A.p[],B.p[])&&on(A.p[],A.p[],B.p[]);
if(C.can==) {C.p[]=A.p[],C.p[]=A.p[];return C;}
C.can|=on(B.p[],B.p[],A.p[])&&on(B.p[],B.p[],A.p[]);
if(C.can==) {C.p[]=B.p[],C.p[]=B.p[];return C;}
if(!C.can){
for(reg i=;i<=;++i){
for(reg j=;j<=;++j){
C.can|=on(A.p[i],B.p[j],A.p[i^])&&on(A.p[i],B.p[j],B.p[j^]);
if(C.can==) {C.p[]=A.p[i],C.p[]=B.p[j];return C;}
}
}
}
}
return C;
}
void build(int x,int l,int r){
if(l==r){
t[x].p[]=t[x].p[]=fid[l];
t[x].can=;return;
}
t[x].can=;
build(x<<,l,mid);
build(x<<|,mid+,r);
pushup(x);
}
void upda(int x,int l,int r,int p,int c){//pos to c
if(l==r){
t[x].p[]=c;t[x].p[]=c;
t[x].can=;return;
}
if(p<=mid) upda(ls,l,mid,p,c);
else upda(rs,mid+,r,p,c);
pushup(x);
}
tr tmp;
int query(int x,int l,int r){
// cout<<" query "<<x<<" "<<l<<" "<<r<<" : ";t[x].op(); tr C;
if(l==r){
if(tmp.can==-){
C=t[x];
}else{
C=merge(tmp,t[x]);
}
return C.can==?l:l-;
}
// cout<<" ls ";t[ls].op();
if(tmp.can==-){
C=t[ls];
}else{
C=merge(tmp,t[ls]);
}
// C.op();
if(C.can){
tmp=C;
return query(rs,mid+,r);
}else{
return query(ls,l,mid);
}
}
int main(){
rd(n);
for(reg i=;i<=n;++i){
rd(id[i]);fid[id[i]]=i;
}
int y;
for(reg i=;i<=n;++i){
rd(y);add(y,i);
}
dfs(,);
for(reg i=;i<=*n-;++i){
lg[i]=(i>>(lg[i-]+))?lg[i-]+:lg[i-];
f[i][]=a[i];
}
// cout<<" tot "<<tot<<endl;
// prt(a,1,tot);
// prt(lg,1,2*n-1);
for(reg j=;j<=;++j){
for(reg i=;i+(<<j)-<=tot;++i){
f[i][j]=big(f[i][j-],f[i+(<<(j-))][j-]);
}
}
build(,,n-); rd(q);
int op,x;
while(q--){
rd(op);
if(op==){
rd(x);rd(y);
upda(,,n-,id[x],y);
upda(,,n-,id[y],x);
swap(id[x],id[y]);
}else{
tmp.init();
tmp.can=-;
printf("%d\n",query(,,n-)+);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/4/11 16:56:19
*/
正难则反考虑二分检验。
和[IOI2018] seats 排座位有点像,维护前缀信息的连通性
修改?能否两两区间合并?树上链的信息合并的套路。
Max Mex的更多相关文章
- Codeforces 1083C Max Mex
Description 一棵\(N\)个节点的树, 每个节点上都有 互不相同的 \([0, ~N-1]\) 的数. 定义一条路径上的数的集合为 \(S\), 求一条路径使得 \(Mex(S)\) 最大 ...
- CF1083C Max Mex 线段树
题面 CF1083C Max Mex 题解 首先我们考虑,如果一个数x是某条路径上的mex,那么这个数要满足什么条件? 1 ~ x - 1的数都必须出现过. x必须没出现过. 现在我们要最大化x,那么 ...
- CF 1083 C. Max Mex
C. Max Mex https://codeforces.com/contest/1083/problem/C 题意: 一棵$n$个点的树,每个点上有一个数(每个点的上的数互不相同,而且构成一个0~ ...
- CodeForces 1084 F Max Mex
Max Mex 题意:问在树上的所有路中mex值最大是多少. 题解: 用线段树维护值. 区间[L,R]意味着 区间[L,R]的数可不可以合并. 重点就是合并的问题了. 首先合法的区间只有3种: 1. ...
- CF 526F Max Mex(倍增求LCA+线段树路径合并)
Max Mex 题目地址:https://codeforces.com/contest/1084/problem/F 然后合并时注意分情况讨论: 参考代码: #include<bits/stdc ...
- 【Codeforces 1083C】Max Mex(线段树 & LCA)
Description 给定一颗 \(n\) 个顶点的树,顶点 \(i\) 有点权 \(p_i\).其中 \(p_1,p_2,\cdots, p_n\) 为一个 \(0\sim (n-1)\) 的一个 ...
- [CF1083C]Max Mex
题目大意:有一棵$n(n\leqslant2\times10^5)$个点的树,每个点有点权,所有的点权构成了$0\sim n-1$的排列.$q(q\leqslant2\times10^5)$次操作,操 ...
- 【线段树】【CF1083C】 Max Mex
Description 给定一棵有 \(n\) 个点的树,每个节点有点权.所有的点权构成了一个 \(0~\sim~n - 1\) 的排列.有 \(q\) 次操作,每次操作 \(1\) 为交换两个点的点 ...
- Codeforces 1083C Max Mex [线段树]
洛谷 Codeforces 思路 很容易发现答案满足单调性,可以二分答案. 接下来询问就转换成判断前缀点集是否能组成一条链. 我最初的想法:找到点集的直径,判断直径是否覆盖了所有点,需要用到树套树,复 ...
随机推荐
- picker-view 组件 的value失效问题
首先检查是不是漏了绑定关系 组件内 组件引用 如过还不行就用下面的方法,顺序问题 在给暂时列表赋值之后再对value赋值
- C# Note2:委托(delegate) & Lambda表达式 & 事件(event)
前言 本文主要讲述委托和Lambda表达式的基础知识,以及如何通过Lambda表达式实现委托调用,并阐述.NET如何将委托用作实现事件的方式. 参考:C#高级编程 1.什么是委托(delegate)? ...
- 关于我使用spring mvc框架做文件上传时遇到的问题
非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...
- 今日头条移动app广告激活数据API对接完整Java代码实现供大家参考》》》项目随记
这是自毕业后的第一篇博客,希望自己今后能养成写博客的一个好习惯.最近公司为了加速APP推广,采取在外部平台(如:今日头条)进行广告投放的方式,进行用户引流.因此我们需要对广告的激活数据进行一个检测,跟 ...
- Newton方法
Newton方法主要解决无等式约束和等式约束的最优化方法. 1.函数进行二阶泰勒展开近似 Taylor近似函数求导等于0进而得到Newton步径.(搜索方向) 2.Newton减量(停止条件) 当1/ ...
- poj2100(尺取法)
题意:选取一系列数,使得这些数的平方和等于n: 解题思路:尺取法扫一遍: #include<iostream> #include<algorithm> using namesp ...
- Nginx 热部署最版本
L10 进入nginx里的sbin目录 拷贝原先的做备份 cp nginx nginx.old 然后将已经编译好的nginx二进制文件复制到sbin目录下并覆盖原有的二进制文件 kill -USR2 ...
- P2123 皇后游戏
题目背景 还记得 NOIP 2012 提高组 Day1 的国王游戏吗?时光飞逝,光阴荏苒,两年 过去了.国王游戏早已过时,如今已被皇后游戏取代,请你来解决类似于国王游 戏的另一个问题. 题目描述 皇后 ...
- AutoCAD Civil 3D多版本插件安装包制作
程序的主要界面如下: 图1 图2 图3 图4 安装包使用Installshield 2016完成. 其中图3是重点,可以选择需要安装的版本,此功能的实现,主要是依靠Installshiel ...
- Listview 包含 edittext 的解决方案
转载:https://blog.csdn.net/qq_28268507/article/details/53666576 一. 前几天在群里聊天,碰到一个哥们问listview的itemview中包 ...