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;什么样的职业轨迹最接近…

轮廓检测

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

WebGL——osg框架学习一

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

OpenCV人脸识别的原理 .

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

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(主成分分析法)…

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…

车牌识别之颜色选取

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

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

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

[EmguCV|C#]使用CvInvoke自己繪製色彩直方圖-直方圖(Hitsogram)系列(4)

2014-02-0610325 0C# 檢舉文章 過年結束了&#xff0c;雖然還是學生所以其實還有兩個禮拜的假期&#xff0c;不過為了不讓自己發慌&#xff0c;趁著假期多利用充實自己&#xff0c;所以提早回到開工狀態&#xff0c;而這次總算要把一直說的自己動手繪製猜色直方圖文章寫出。 …

轮廓的查找、表达、绘制、特性及匹配(How to Use Contour? Find, Component, Construct, Features Match)

前言 轮廓是构成任何一个形状的边界或外形线。前面讲了如何根据色彩及色彩的分布&#xff08;直方图对比和模板匹配&#xff09;来进行匹配&#xff0c;现在我们来看看如何利用物体的轮廓。包括以下内容&#xff1a;轮廓的查找、表达方式、组织方式、绘制、特性、匹配。 查…

itcast-ssh-crm实践

分析 BaseDao 文件上传 转载于:https://www.cnblogs.com/hellowq/p/10209761.html

分类器大牛们

David Lowe&#xff1a;Sift算法的发明者&#xff0c;天才。 Rob Hess&#xff1a;sift的源码OpenSift的作者&#xff0c;个人主页上有openSift的下载链接&#xff0c;Opencv中sift的实现&#xff0c;也是参考这个。 Koen van de Sande&#xff1a;作者给出了sift,densesift,co…

利用python脚本程序监控文件被修改

需求&#xff1a;利用python编写监控程序&#xff0c;监控一个文件目录&#xff0c;当目录下的文件发生改变时&#xff0c;实现有修改就发报警邮件 邮件使用QQ邮箱&#xff0c;需要开启smtp&#xff0c;使用手机发生短信&#xff0c;腾讯会给你发邮箱密码。如下所示&#xff1a…

Oracle RAC

环境如下&#xff1a; Linux操作系统&#xff1a;Centos 6.5 64bit &#xff08;这个版本的redhat 6内核等OS在安装grid最后执行root.sh时会出现crs-4124&#xff0c;是oracle11.2.0.1的bug&#xff09; VMware version&#xff1a;Workstation 8.0.3 build-703057 Oracle…

Activiti多人会签例子

Activiti中提供了多实例任务&#xff08;for-each&#xff09;将多实例应到到UserTask中可以实现会签功能。 Multi-instance (for each) Description A multi-instance activity is a way of defining repetition for a certain step in a business process. In programming …

MySQL-ProxySQL中间件(一)| ProxySQL基本概念

目录 MySQL-ProxySQL中间件&#xff08;一&#xff09;| ProxySQL基本概念&#xff1a; https://www.cnblogs.com/SQLServer2012/p/10972593.htmlMySQL-ProxySQL中间件&#xff08;二&#xff09;| Admin Schemas介绍&#xff1a;https://www.cnblogs.com/SQLServer2012/p/109…

标签td设置隐藏(hidden)

这样设置这个td就不会被其他的td给挤掉了! 还有一种方法就是把tr标签的solid设置为0px 这个方法把td标签的left,right,bottom,top的边框的solid全部设置为0px;转载于:https://www.cnblogs.com/tranquilityMan/p/10972811.html

Windows Server 2008 NFS

打开Windows Server 2008的Dos运行窗口&#xff08;不是powershell&#xff09;&#xff0c;然后键入&#xff1a; servermanagercmd.exe -install FS-NFS-Services 安装完毕之后&#xff0c;就要把NFS的存贮映射到Windows Server 2008上某个盘符以供使用&#xff0c;但为了…