UOJ【UR #12】实验室外的攻防战
2024-08-22 09:19:04
题意:
给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$
变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$
考虑一个数字从A排列到B排列连出来的路径与其他数字是否相交,相交就表示大小关系需要判断,(类似于二维偏序)用线段树维护区间最小值即可。
权值为1,2的线分别与权值为4的线相交,而且4在它们左边,所以需要判断它们的大小关系,发现${4>1}$,${4>2}$,所以满足条件。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 20000010
#define MAXN 2000100
#define llg int
#define inf 0x7fffffff
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,minl[maxn],a[MAXN],c[MAXN],rank[MAXN]; llg min_(llg o,llg l,llg r,llg L,llg R)
{
if (l>=L && r<=R)
{
return minl[o];
}
llg lc=o<<,rc=o<<|,mid=(l+r)>>;
llg ans=inf;
if (L<=mid) ans=min(ans,min_(lc,l,mid,L,R));
if (R>mid) ans=min(ans,min_(rc,mid+,r,L,R));
return ans;
} void add(llg o,llg l,llg r,llg wz,llg val)
{
if (l==r)
{
minl[o]=val;
return ;
}
llg lc=o<<,rc=o<<|,mid=(l+r)>>;
if (wz<=mid) add(lc,l,mid,wz,val);
if (wz>mid) add(rc,mid+,r,wz,val);
minl[o]=min(minl[lc],minl[rc]);
}
inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
}
int main()
{
//yyj("C");
cin>>n;
for (llg i=;i<=n;i++) a[i]=getint();
for (llg i=;i<=n;i++) c[i]=getint();
for (llg i=;i<=n;i++) rank[c[i]]=i;
for (llg i=;i<=;i++) minl[i]=inf;
for (llg i=;i<=n;i++)
{
llg x=rank[a[i]];
llg v=min_(,,n,x,n);
if (a[i]>v) {cout<<"NO"; return ;}
add(,,n,x,a[i]);
}
cout<<"YES";
return ;
}
最新文章
- (转)单机上配置hadoop
- 济南学习 Day 2 T3 am
- 使用DBCC SHOW_STATISTICS展示索引的统计信息
- iOS类别(Category)
- Android 学习手札(三) 视图(View)
- hdu 2289 Cup (二分法)
- 使用WebUploader使用,及使用后测试横拍或竖拍图片图片方向不对等解决方案
- Hibernate 多对多映射
- 虚拟机安装中文Fedora14和C/C++IDE开发环境
- .NET:从 Mono、.NET Core 说起
- mcstructs使用CMake生成Makefile文件
- python递归查找文件目录
- 海外仓系统 COD货到付款到付功能
- Java Native方法
- Redis服务信息
- properties类是Hashtable的子类
- Win7 Win8 Win10取不到机器码的处理办法
- c++进阶学习
- Linux sed 流编辑器
- Mac安装zsh oh-my-zsh