CF 526F Max Mex(倍增求LCA+线段树路径合并)

Max Mex

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

 

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


 

参考代码:
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define pb push_back
  4 #define mkp make_pair
  5 #define fi first
  6 #define se second
  7 typedef long long ll;
  8 typedef pair<int,int> PII;
  9 const int INF=0x3f3f3f3f;
 10 inline int read()
 11 {
 12     int x=0,f=1;char ch=getchar();
 13     while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
 14     while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
 15     return x*f;
 16 }
 17 const int maxn=2e5+10;
 18 int n,q,typ,x,y,cnt,ans;
 19 int a[maxn],in[maxn],out[maxn];
 20 int dep[maxn],fc[21],fa[21][maxn];
 21 vector<int> G[maxn];
 22 PII res;
 23 
 24 inline void dfs(int u)
 25 {
 26     in[u]=++cnt;
 27     for(int i=1;fc[i]<=dep[u];++i) fa[i][u]=fa[i-1][fa[i-1][u]];
 28     for(int i=0,len=G[u].size();i<len;++i)
 29     {
 30         dep[G[u][i]]=dep[u]+1;fa[0][G[u][i]]=u;
 31         dfs(G[u][i]);    
 32     } 
 33     out[u]=++cnt;
 34 }
 35 
 36 inline int LCA(int x,int y)
 37 {
 38     if(dep[x]<dep[y]) swap(x,y);
 39     for(int i=0,t=dep[x]-dep[y];t;++i)
 40         if(t&fc[i]) x=fa[i][x],t^=fc[i];
 41     for(int i=20;~i;--i) if(fa[i][x]^fa[i][y])
 42         x=fa[i][x],y=fa[i][y];
 43     return x==y? x:fa[0][x];
 44 }
 45 
 46 namespace Segment
 47 {
 48     #define ls (rt<<1)
 49     #define rs (rt<<1|1)
 50     PII T[maxn<<2];
 51     
 52     bool anc(int x,int y){return in[x]<=in[y]&&out[x]>=out[y];}
 53     
 54     PII check(PII x,int y)
 55     {
 56         if(!x.fi || !y) return mkp(0,0);
 57         if(anc(x.fi,x.se)) swap(x.fi,x.se);
 58         if(anc(x.se,x.fi))
 59         {
 60             if(anc(x.fi,y)) return mkp(y,x.se);
 61             if(anc(x.se,y))
 62             {
 63                 if(anc(y,x.fi)) return x;
 64                 if(LCA(x.fi,y)==x.se) return mkp(x.fi,y);
 65                 return mkp(0,0);
 66             }
 67             return mkp(y,x.fi);
 68         }
 69         
 70         if(anc(x.fi,y)) return mkp(y,x.se);
 71         if(anc(x.se,y)) return mkp(x.fi,y);
 72         if(!anc(LCA(x.fi,x.se),y)) return mkp(0,0);
 73         if(!anc(y,x.fi) && !anc(y,x.se)) return mkp(0,0);
 74         return x;
 75     }
 76     
 77     PII merge(PII x,PII y)
 78     {
 79         if(x.fi==-1) return y;
 80         x=check(x,y.fi);x=check(x,y.se);
 81         return x;
 82     }
 83     
 84     void update(int rt,int l,int r,int pos,int x)
 85     {
 86         if(l==r){T[rt]=mkp(x,x);return ;}
 87         int mid=l+r>>1;
 88         if(pos<=mid) update(ls,l,mid,pos,x);
 89         else update(rs,mid+1,r,pos,x);
 90         T[rt]=merge(T[ls],T[rs]);
 91     }
 92     
 93     bool query(int rt,int l,int r)
 94     {
 95         PII tmp=merge(res,T[rt]);
 96         if(tmp.fi){res=tmp;ans=r;return true;}
 97         if(l==r) return false;//
 98         int mid=l+r>>1;
 99         if(query(ls,l,mid)) query(rs,mid+1,r);
100         return false; 
101     }
102 }
103 using namespace Segment;
104 
105 int main()
106 {
107     n=read(); fc[0]=1;
108     for(int i=1;i<=n;++i) a[i]=read()+1;
109     for(int i=2;i<=n;++i) G[read()].pb(i);
110     for(int i=1;i<=20;++i) fc[i]=fc[i-1]<<1;
111     dfs(1);
112     for(int i=1;i<=n;++i) update(1,1,n,a[i],i);
113     q=read();
114     while(q--)
115     {
116         typ=read();
117         if(typ==1)
118         {
119             x=read();y=read();swap(a[x],a[y]);
120             update(1,1,n,a[x],x);update(1,1,n,a[y],y);
121         }
122         else
123         {
124             res=mkp(-1,0);ans=1;query(1,1,n);
125             printf("%d\n",ans);
126         }
127     }
128     
129     return 0;
130 }
View Code

 

;

转载于:https://www.cnblogs.com/songorz/p/10196827.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学刚毕业,零基础大数据如何入门?

这篇文章中&#xff0c;本文作者将针对三种不同的、想要进入数据科学领域的人群&#xff0c;给出自己的经验&#xff0c;帮助他们迅速有效入行。无论是软件工程师、应届毕业生&#xff0c;还是完全初学者&#xff0c;都要问自己一个关键问题&#xff1a;什么样的职业轨迹最接近…

Opencv EmguCv 基本识别步骤

{//1.灰度化&#xff0c;竖向边缘检测//2.自适应二值化处理//3.形态学处理&#xff08;膨胀和腐蚀&#xff09;//4.轮廓查找与筛选Image<Bgr, byte> simage OriImage; //new Image<Bgr, byte>("license-plate.jpg");//Image<Bgr, Byte> simage…

(转)Java中的守护线程

Java的守护线程与非守护线程 守护线程与非守护线程 最近在看多线程的Timer章节&#xff0c;发现运用到了守护线程&#xff0c;感觉Java的基础知识还是需要补充。 Java分为两种线程&#xff1a;用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程…

vue项目中对axios的全局封装

项目中接口会很多&#xff0c;个人喜欢创建api文件对请求统一管理1.新建api文件夹&#xff0c;文件夹下创建 axios.js&#xff0c;login.js2. axios.jsimport axios from axiosimport router from ../router //引入路由是为了做重定向&#xff0c;比如没有登录过期定向到登录页…

轮廓检测

轮廓&#xff08;Contours&#xff09;&#xff0c;指的是有相同颜色或者密度&#xff0c;连接所有连续点的一条曲线。检测轮廓的工作对形状分析和物体检测与识别都非常有用。 在轮廓检测之前&#xff0c;首先要对图片进行二值化或者Canny边缘检测。在OpenCV中&#xff0c;寻找…

【大数据】阿里云大数据助理工程师认证(ACA)课程

阿里云大数据助理工程师认证&#xff08;Alibaba Cloud Certified Associate&#xff0c;ACA&#xff09; 是面向使用阿里云大数据产品的专业技术认证&#xff0c;主要涉及阿里云的大数据计算、存储、开发平台&#xff0c;数据应用类的基础产品。是对学员掌握阿里云大数据产品技…

WebGL——osg框架学习一

从今天开始&#xff0c;我们开始正式的学习osg框架&#xff0c;今天我们学习的是osg的渲染模块&#xff0c;我们来看一下代码结构。 所有DrawXXX的js模块都是渲染的模块&#xff0c;我们逐一来简单介绍一下&#xff0c;第一个Drawable.js&#xff0c;这个模块是描述可绘制对象的…

EmguCV 一些基本操作

一、先是在程序中图像的导入&#xff0c;我是根据图像路径实现&#xff0c;其中path是string类型&#xff0c;是图像路径。 IntPtr imgCvInvoke.cvLoadImage(path, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); 二、图像灰度化处理&#xff0c;先创建一幅尺寸大小…

Java字符串分割

java中字符串的分割函数&#xff0c;split("你想要分割的字符", 你想要最多分割为多少段&#xff0c;正整数&#xff09; 注意事项&#xff1a; 1.分割特殊字符考虑转义字符的使用。如&#xff1a; . \ | 2.第二个参数&#xff1a; 无&#xff1a; 不传默认分割全部…

OpenCV人脸识别的原理 .

在之前讲到的人脸测试后&#xff0c;提取出人脸来&#xff0c;并且保存下来&#xff0c;以供训练或识别是用&#xff0c;提取人脸的代码如下&#xff1a; [html] view plaincopy print?void GetImageRect(IplImage* orgImage, CvRect rectInImage, IplImage* imgRect,double s…

说一下SEO和SEM到底有哪些区别?

开场白免了&#xff0c;我们直接说与主题相关的。 SEO和SEM到底有什么区别&#xff1f; SEO和SEM到底有什么区别 我们先理解字面意思&#xff1a; SEO&#xff08;Search Engine Optimization&#xff09;&#xff1a;汉译为搜索引擎优化。 SEM&#xff08;Search Engine Marke…

django模型的继承

很多时候&#xff0c;我们都不是从‘一穷二白’开始编写模型的&#xff0c;有时候可以从第三方库中继承&#xff0c;有时候可以从以前的代码中继承&#xff0c;甚至现写一个模型用于被其它模型继承。这样做的好处&#xff0c;我就不赘述了&#xff0c;每个学习Django的人都非常…

SpringBoot部署项目到Docker仓库

SpringBoot部署项目到Docker仓库1.开启远程控制端口Centos7开启方式&#xff1a; vim /lib/systemd/system/docker.service找到ExecStart行 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock 重启docker 启动 systemctl start docker守护进程…

人脸识别经典方法

这篇文章是撸主要介绍人脸识别经典方法的第一篇&#xff0c;后续会有其他方法更新。特征脸方法基本是将人脸识别推向真正可用的第一种方法&#xff0c;了解一下还是很有必要的。特征脸用到的理论基础PCA在另一篇博客里&#xff1a;特征脸(Eigenface)理论基础-PCA(主成分分析法)…

Jquery常用正则验证

常用校验的正则表达式var rulesConfig { /** * str.replace(/^\s|\s$/g, ) 解析&#xff1a; str&#xff1a;要替换的字符串 \s : 表示 space &#xff0c;空格 &#xff1a; 一个或多个 ^&#xff1a; 开始&#xff0c;^\s&#xff0c;以空格开始 $&#xff1a; 结束&#x…

svm参数说明

svm参数说明---------------------- 如果你要输出类的概率&#xff0c;一定要有-b参数 svm-train training_set_file model_file svm-predict test_file model_fileoutput_file 自动脚本&#xff1a;Python easy.py train_data test_data 自动选择最优参数&#xff0c;自动进行…

poj-3667(线段树区间合并)

题目链接&#xff1a;传送门 参考文章&#xff1a;传送门 思路&#xff1a;线段树区间合并问题&#xff0c;每次查询到满足线段树的区间最左值&#xff0c;然后更新线段树。 #include<iostream> #include<cstdio> #include<cstring> using namespace std; co…

面试题编程题11-python 生成随机数

随机整数&#xff1a; random.randint(a,b), [a,b] random.randrange(a,b,step) [a,b) 随机实数 random.random()返回0 到1 之间的浮点数转载于:https://www.cnblogs.com/feihujiushiwo/p/10922454.html

车牌识别之颜色选取

车牌定位是车牌识别中第一步&#xff0c;也是最重要的一步。 由于中国车牌种类多样&#xff0c;颜色不一&#xff0c; 再加上车牌经常有污损&#xff0c;以及车牌周围干扰因素太多&#xff0c;都成为了车牌定位的难点。 这里首先使用最简单算法来描述车牌定位&#xff0c;以及他…

Python - 排序( 插入, 冒泡, 快速, 二分 )

插入排序 算法分析 两次循环, 大循环对队列中的每一个元素拿出来作为小循环的裁定对象 小循环对堆当前循环对象在有序队列中寻找插入的位置 性能参数 空间复杂度  O(1) 时间复杂度  O(n^2) 详细代码解读 import randomdef func(l):# 外层循环: 对应遍历所有的无序数据for i…