题目大意

有两个长度为\(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. maven坐标及依赖范围的学习(1)

    首先,我们先了解什么是maven的坐标(重中之重): 在这里我们可以看到那三个红色的行,基本是pom.xml中出现的最多的配置     例如这个配置:这里我们可以看到我们这个项目的pom文件中,他对名 ...

  2. TensorFlow错误ValueError: No gradients provided for any variable

    使用TensorFlow训练神经网络的时候,出现以下报错信息: Traceback (most recent call last):   File "gan.py", line 1 ...

  3. Ubuntu使用PBIS认证

    1:下载 https://github.com/BeyondTrust/pbis-open/releases wget https://github.com/BeyondTrust/pbis-open ...

  4. jdbc结合commons-dbutils-1.6.jar做素材数据处理的例子

    前两个 insertTitle,insertOpening 是刚开始做的针对单一素材数据解析及写入的方法,后面一个 insertMaterial 是后期封装的一个可处理各种素材导入的方法,main方法 ...

  5. 1.分布式配置中心 spring-cloud-config

    pring Cloud 版本:2.1.0.RELEASE 一.server端 1.maven依赖 <dependency> <groupId>org.springframewo ...

  6. LC 820. Short Encoding of Words

    Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...

  7. Kotlin中单例Singleton模式

    package loaderman.bar class Singlenton private constructor(){ public var value:Singlenton?=null priv ...

  8. kotlin之包

    在kotlin中包的概念在表达方式上与Java完全一样,不过kotlin中的包和目录没有关系,kotlin包仅仅是为了引用文件中的资源而设计的. package loaderman.bar fun p ...

  9. 映射器Mapping

    1)  org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(核心) 将程序员定义的Action所对应的<bean& ...

  10. HttpClient提交数据

    用代码模拟浏览器的行为 * 轻量级的开源的框架 * Android在6.0 23 以后移除了httpclient ,所以开发中用的少了 * 编写步骤: 1. 打开浏览器 2. 输入网址 3. 敲回车 ...