学长小清新题表之UOJ 180.实验室外的攻防战

题目描述

时针指向午夜十二点,约定的日子——\(2\)月\(28\)日终于到来了。随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks\) 博士所在的实验室。

当然,\(picks\) 博士不会坐以待毙,他早就率领着他的猴子们在实验室外修筑了许多的坚固防御工事。

经过跳蚤侦察兵的勘察,跳蚤国王发现 \(picks\) 博士的防御工事有着 \(n\)

处薄弱点,于是他把他的跳蚤大军分成了 \(n\) 支小队,并打算让它们分别进攻每一个薄弱点。但是因为战场混乱,这 \(n\) 支小队的位置被打乱了,重新整队之后,跳蚤国王发现第 \(i\)个位置的小队编号为 \(A_i\)(显然 \(A\)是一个排列)。

经过计算,跳蚤国王发现,让第 \(i\)个位置的小队编号为 \(Bi\) 时,他的军队可以发挥出最大的战斗力(保证 \(B\)也是一个排列)。

跳蚤国王可以发出指令来改变小队们的排列顺序,每一次,他都会报出一个整数 \(i(1≤i<n)\)。如果排在第 \(i\) 个位置的小队编号大于第 \(i+1\)

个位置的小队,那么这两支小队会交换顺序,否则这一个命令将会被忽略。

现在跳蚤国王希望他的军队能够发挥出最强大的战斗力,于是他想要知道是否存在一种指令序列,使得小队们可以按照排列 \(B\)的方式排列。

但是因为小队数目实在是太多,跳蚤国王一时间也没有看出答案。于是他派跳蚤绑架来了你——这附近最著名的民间科学家来帮他计算这个问题的答案。

输入格式

输入数据第一行包含一个正整数 \(n\)。

接下来两行每行 \(n\)个正整数,分别描述排列 \(A\) 和排列 \(B\)。

输出格式

对于每组数据,如果存在这样的指令序列,输出“YES”,否则输出“NO”(引号不输出,请注意大小写)。

样例一

input

3

2 3 1

2 1 3

output

YES

explanation

只要报出\(2\),也就是交换第\(2\)个位置和第\(3\)个位置的小队即可。

样例二

input

3

2 1 3

3 1 2

output

NO

explanation

注意只有相邻的满足前一个数大于后一个数的情况下才可以交换。

样例三

input

5

4 1 2 5 3

1 2 4 3 5

output

YES

explanation

步骤如下(每次交换的两个数加粗表示):

4 1 2 5 3

1 4 2 5 3

1 2 4 5 3

1 2 4 3 5

样例四

input

5

1 5 3 4 2

1 2 4 3 5

output

NO

样例五

input

8

8 2 7 4 5 3 6 1

2 8 5 7 4 3 6 1

output

NO

样例六

见样例数据下载。这组数据符合子任务 \(2\) 的限制与约定。

样例七

见样例数据下载。这组数据符合子任务 \(3\) 的限制与约定。

限制与约定

|子任务| 分值 |限制与约定|

|-|-|

|1 |24| \(n≤8\)|

|2| 32 |\(n≤1000\)|

|3 |44| \(n≤100000\)|

对于所有数据,\(1≤n≤100000\),保证输入的\(A\)和\(B\)均为一个排列。

时间限制:\(1s\)

空间限制:\(256MB\)

分析

这一道题有点像

首先我们考虑什么样的情况是不存在的

很显然,在当前队列中,如果\(i\)在\(j\)的左边,而在目标队列中\(i\)在\(j\)的右边,并且\(i\)的值要小于\(j\)的值,那么就是不合法的

因为只有相邻的满足前一个数大于后一个数的情况下才可以交换

所以我们按照权值从小到大排好序,同时建立一个线段树,用在\(b\)序列中的位置当作下标,\(a\)序列中的位置当作权值

每次我们查询在\(b\)序列中下标大于当前值的元素在\(a\)序列中最小的下标,如果能查询到,就输出\(NO\)

否则在最后输出\(YES\)

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
inline int read(){
register int x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
struct asd{
int val,wz;
}jl[maxn];
int a[maxn],b[maxn],rk[maxn],rkk[maxn];
bool cmp(asd aa,asd bb){
return aa.val<bb.val;
}
struct trr{
int l,r,val;
}tr[maxn];
void push_up(int da){
tr[da].val=min(tr[da<<1].val,tr[da<<1|1].val);
}
void build(int da,int l,int r){
tr[da].l=l,tr[da].r=r;
if(l==r){
tr[da].val=0x3f3f3f3f;
return;
}
int mids=(l+r)>>1;
build(da<<1,l,mids);
build(da<<1|1,mids+1,r);
push_up(da);
}
void xg(int da,int t,int w){
if(tr[da].l==tr[da].r){
tr[da].val=min(tr[da].val,w);
return;
}
int mids=(tr[da].l+tr[da].r)>>1;
if(t<=mids) xg(da<<1,t,w);
else xg(da<<1|1,t,w);
push_up(da);
}
int cx(int da,int l,int r){
if(tr[da].l>=l && tr[da].r<=r){
return tr[da].val;
}
int ans=0x3f3f3f3f,mids=(tr[da].l+tr[da].r)>>1;
if(l<=mids) ans=min(ans,cx(da<<1,l,r));
if(r>mids) ans=min(ans,cx(da<<1|1,l,r));
return ans;
}
int main(){
int n;
n=read();
build(1,1,n);
for(register int i=1;i<=n;i++){
a[i]=read();
rkk[a[i]]=i;
}
for(register int i=1;i<=n;i++){
b[i]=read();
rk[b[i]]=i;
}
for(register int i=1;i<=n;i++){
jl[i].val=a[i];
jl[i].wz=rk[a[i]];
}
sort(jl+1,jl+1+n,cmp);
for(register int i=1;i<=n;i++){
int now=cx(1,jl[i].wz,n);
if(now<rkk[jl[i].val]){
printf("NO\n");
return 0;
}
xg(1,jl[i].wz,rkk[jl[i].val]);
}
printf("YES\n");
return 0;
}

学长小清新题表之UOJ 180.实验室外的攻防战的更多相关文章

  1. 学长小清新题表之UOJ 14.DZY Loves Graph

    学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...

  2. 学长小清新题表之UOJ 31.猪猪侠再战括号序列

    学长小清新题表之UOJ 31.猪猪侠再战括号序列 题目描述 大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫\(\_CallMeGGBond\). 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领 ...

  3. 实验室外的攻防战 UOJ#180 [树状数组]

    实验室外的攻防战 UOJ#180 [树状数组] 题目 时针指向午夜十二点,约定的日子--2月28日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks\) 博士所在的实验室 ...

  4. UOJ 180【UR #12】实验室外的攻防战

    http://uoj.ac/contest/25/problem/180 从前往后对比串A,B 当$A_i,B_i$不相同时找到$B_i$在A中的位置j 若$min{A_1,A_2,A_3...... ...

  5. UOJ【UR #12】实验室外的攻防战

    题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...

  6. 【Luogu3676】小清新数据结构题(动态点分治)

    [Luogu3676]小清新数据结构题(动态点分治) 题面 洛谷 题解 先扯远点,这题我第一次看的时候觉得是一个树链剖分+线段树维护. 做法大概是这样: 我们先以任意一个点为根,把当前点看成是一棵有根 ...

  7. 思维题练习专场-DP篇(附题表)

    转载请注明原文地址http://www.cnblogs.com/LadyLex/p/8536399.html 听说今年省选很可怕?刷题刷题刷题 省选已经结束了但是我们要继续刷题刷题刷题 目标是“有思维 ...

  8. LuoguP3674 小清新人渣的本愿 && BZOJ4810: [Ynoi2017]由乃的玉米田

    题目地址 小清新人渣的本愿 [Ynoi2017]由乃的玉米田 所以这两题也就输出不一样而已 题解 这种lxl的题还是没修改操作的题基本就是莫队 分开考虑每个询问 1.减法 \(a-b=x⇒a=b+x\ ...

  9. P3674 小清新人渣的本愿

    P3674 小清新人渣的本愿 一道妙不可言的题啊,,, 一看就知道是个莫队 考虑求答案 1号操作就是个大bitset,动态维护当前的bitset \(S\),把能取哪些值都搞出来,只要\(S\ and ...

随机推荐

  1. 干货分享:Python Web 部署方式大全

    不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...

  2. 设计模式:command模式

    目的:将命令设计成类的形式,并可以组织成队列 优点: 在需要的情况下,可以比较容易地将命令记入日志 可以容易的实现对请求的撤销和重做 由于新的具体命令类不影响其他的命令类,因此增加新的具体命令类很容易 ...

  3. 设计模式:visitor模式

    核心:将数据结构和数据的处理分开 注意:注意函数的参数传递和调用关系 例子: class Element; class Visitor { public: virtual void Visit(Ele ...

  4. C++语法小记---标准库

    C++标准库 C++标准库包含如下内容: C++标准编译工具链 C++扩展编译工具链(各种C++编译器独有) C++标准库 C++库 C库 C兼容库(为了兼容能够用C编译器编译的项目,直接使用C++也 ...

  5. 商品表(spu)、规格表(sku)设计

    1. 先做一下专业术语解释:spu和sku 这里拿iphone6s举例,它身上有很多的属性和值, 比如: 毛重: 420.00 g 产地: 中国大陆 容量: 16G, 64G, 128G 颜色: 银, ...

  6. springMVC -- 对接UEditor(富文本编辑器)

    工作中需要用到UEditor编辑文本,在与springMVC进行整合时,出现了一些问题,结果导致,在进行图片上传时出现如下提示: 上网查询了很多相关资料,此处简要记录下,防止以后遇到类似问题. 一种方 ...

  7. 重学c#系列——c# 托管和非托管资源与代码相关(四)

    前言 这是续第三节. 概况垃圾回收与我们写代码的关系: 强引用和弱引用 针对共享 Web 承载优化 垃圾回收和性能 应用程序域资源监视 正文 强引用和弱引用 垃圾回收器不能回收仍在引用的对象的内存-- ...

  8. 推荐一款技术人必备的接口测试神器:Apifox

    1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色.当然除了Postma ...

  9. 自动化不知如何参数化?xlrd来帮你解决

    平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离.把测试数据都写在业务里面的话,比较混杂.为了方便管理测试数据,所以引入了python的一个扩展库--xlrd.该库使用简单,能满足自动化测试的 ...

  10. ubuntu的docker安装

    安装docker 安装 介绍一下docker 的中央仓库们 Docker官方中央仓库: https://hub.docker.com/ 因为docker 网站在国外所以访问速度和你的运气有关还有网络. ...