题目大意

有两个长度为\(n\)的序列\(a_1,...,a_n\),\(b_1,...,b_n\)(\(a,b\leq n\leq 3\times 10^5\) )。一次操作是选取 \([l,r]\) ,将 \(a_l,...,a_r\) 排序。问能否通过若干次操作把 \(a_1,...,a_n\) 变得和 \(b_1,...,b_n\) 一样。

题解

这个人讲得很清楚

首先,如果\(a,b\)中每个数的出现次数不一样,那么一定不能。

其余的部分的问题在于能不能通过交换\(a\)中一些数的位置使\(a\)变得和\(b\)一样。

设\(a\)中两个位置\(i,j\)的数在\(b\)中的位置为\(i',j'\)。

当\(i<j\)且\(i'>j'\)时,要想使\(a,b\)相同必须交换\(i,j\)的位置,一定存在一次操作使\([i,j]\in[l,r]\)。

当\(a_i<a_j\)且\(i'>j'\)时,如果存在一次操作\([i,j]\in[l,r]\),那么\(a_i\)就会被换到\(a_j\)左边,而且没法再换回来了,所以此时对于任意一次操作都没有\([min(i,j),max(i,j)]\in[l,r]\)。

所以当存在\(a_i<a_j\)且\(i<j\)且\(i'>j'\)时,一定没有合法解。

想要判断这部分,可以从左往右扫序列\(b\),对于\(b_i\),设\(b_i\)在\(a\)中目前第一次出现的位置为\(p(i)\),若\(min\{a_j|j\in[1,p(i)]\}<b_i\)那么就没有合法解;反之,将\(a_{p(i)}\)改为\(+inf\),继续判断剩下的。

代码
#include<algorithm>
#include<cmath>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define view(u,k) for(int k=fir[u];~k;k=nxt[k])
#define LL long long
#define maxn 300007
#define ls (u<<1)
#define rs (u<<1|1)
#define mi (l+r>>1)
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar(' ');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar(' ');
return;
}
int t,n,a[maxn],b[maxn],tr[maxn<<2],ta[maxn],tb[maxn],fir[maxn],nxt[maxn];
void pu(int u){tr[u]=min(tr[ls],tr[rs]);}
void add(int u,int l,int r,int x,int k)
{
if(x<=l&&r<=x){tr[u]=k;return;}
if(x<=mi)add(ls,l,mi,x,k);
else add(rs,mi+1,r,x,k);
pu(u);return;
}
int ask(int u,int l,int r,int x,int y)
{
if(x<=l&&r<=y)return tr[u];
int res=n+1;
if(x<=mi)res=ask(ls,l,mi,x,y);
if(y>mi)res=min(res,ask(rs,mi+1,r,x,y));
return res;
}
void build(int u,int l,int r)
{
if(l==r){tr[u]=a[l];return;}
build(ls,l,mi),build(rs,mi+1,r),pu(u);return;
}
int main()
{
t=read();
while(t--)
{
n=read();int ans=1;
rep(i,1,n)ta[i]=a[i]=read(),fir[i]=-1;
rep(i,1,n)tb[i]=b[i]=read();
sort(ta+1,ta+n+1),sort(tb+1,tb+n+1);
rep(i,1,n)if(ta[i]!=tb[i]){ans=0;break;}
if(!ans){puts("NO");continue;}
build(1,1,n);
dwn(i,n,1){nxt[i]=fir[a[i]],fir[a[i]]=i;}
rep(i,1,n)
{
int pos=fir[b[i]],mn=ask(1,1,n,1,pos);fir[b[i]]=nxt[pos];
if(mn<b[i]){ans=0;break;}
add(1,1,n,pos,n+1);
}
if(!ans)puts("NO");
else puts("YES");
}
return 0;
}
WAWAWAWA

1.将\(b\)分成很多段,每一段连续且不下降且尽可能长。若\(b\)一段中的每个数的个数和\(a\)对应这一段位置的每个数的个数不同,那么NO,否则YES。

2.最小的数无法往右走但往左走多远都行,…,最大的数无法往左走但往右走多远都行。计算\(a\)中每个数最多往右走几个、最多往左走几个,如果这个数在\(a\)中的位置和它在\(b\)中的位置的差距大于这个范围,就NO,否则YES。

3.正解,但没有判\(a,b\)整体上是不是所有数的个数一样。

4.正解,但是没有反着求“fir”“nxt”。

并不对劲的复健训练-CF1187D的更多相关文章

  1. 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击

    题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...

  2. 并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎

    题目大意 题目链接 题解 先将\(a\)排序. \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上:而当\(a_m= ...

  3. 并不对劲的复健训练-CF1205B Shortest Cycle

    题目大意 有\(n\)(\(n\leq 10^5\))个数\(a_1,...,a_n\)(\(a\leq 10^{18}\)).有一个图用这个方法生成:若\(a_i\)按位与\(a_j\)不为0,则在 ...

  4. 并不对劲的复健训练-p5212 SubString

    题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...

  5. 并不对劲的复健训练-bzoj5249:loj2472:p4364[2018多省联考]IIIDX

    题目大意 给出\(n,k,d_1,...,d_n\)(\(n\leq 5\times 10^5,1<k\leq 10^9,d\leq 10^9,k\in R\)).有一个满足 对于每个点\(i\ ...

  6. 并不对劲的复健训练-bzoj5253:loj2479:p4384:[2018多省联考]制胡窜

    题目大意 给出一个字符串\(S\),长度为\(n\)(\(n\leq 10^5\)),\(S[l:r]\)表示\(S_l,S_{l+1}...,S_r\)这个子串.有\(m\)(\(m\leq 3\t ...

  7. 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列

    题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...

  8. 并不对劲的复健训练-p3674

    题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...

  9. 2019NOIP算法复健+学习

    前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...

随机推荐

  1. php反序列化笔记

    普通的魔法方法 public,private,protected属性序列化后的不同 绕过wakeup session反序列化 phar反序列化 1.普通的魔法方法 __construct() 创建一个 ...

  2. Linux设备驱动程序 之 并发及其管理

    竞态产生 Linux系统找那个存在大量的并发联系,因此会导致可能的竞态: 1. 正在运行的用户空间进程可以以多种组合方式访问我们的代码: 2. SMP系统甚至可以再不同的处理器上同时执行我们的代码: ...

  3. LeetCode 岛屿的最大面积(探索字节跳动)

    题目描述 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被水包围着. 找到给定的 ...

  4. UML建模综述

    一.概念 UML-Unified Model Language 统一建模语言,又称标准建模语言.是用来对软件密集系统进行可视化建模的一种语言.作为一个支持模型化和软件系统开发的图形化语言,UML为软件 ...

  5. js中bind解析

    一.arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arg ...

  6. Java堆大小[z]

    JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制. 32位系统下,一般限制在1.5G~2G:64为操作系统对内存 ...

  7. vue组件命名和传值 and 父子组件传值

    https://www.cnblogs.com/lianxisheng/p/10907350.html

  8. JAVA 基础编程练习题16 【程序 16 输入 9*9 表】

    16 [程序 16 输入 9*9 表] 题目:输出 9*9 口诀. 程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列. package cskaoyan; public class ...

  9. confilicts

    confilicts 矛盾; 冲突 安装软件提升这个表示安装软件之间的冲突,需要卸载冲突的软件再安装

  10. Kubernetes-kubectl The connection to the server localhost:8080 was refused -did you specify

    今天在Kubernetes的从节点上运行命令[kubectl]出现了如下错误: [root@k8snode1 kubernetes]# kubectl get pod The connection t ...