并不对劲的复健训练-CF1187D
题目大意
有两个长度为\(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的更多相关文章
- 并不对劲的复健训练-bzoj5250:loj2473:p4365:[九省联考2018]秘密袭击
题目大意 有一棵\(n\)(\(n\leq 1666\))个点的树,有点权\(d_i\),点权最大值为\(w\)(\(w\leq 1666\)).给出\(k\)(\(k\leq n\)),定义一个选择 ...
- 并不对劲的复健训练-bzoj5339:loj2578:p4593:[TJOI2018]教科书般的亵渎
题目大意 题目链接 题解 先将\(a\)排序. \(k\)看上去等于怪的血量连续段的个数,但是要注意当存在\(a_i+1=a_{i+1}\)时,虽然它们之间的连续段为空,但是还要算上:而当\(a_m= ...
- 并不对劲的复健训练-CF1205B Shortest Cycle
题目大意 有\(n\)(\(n\leq 10^5\))个数\(a_1,...,a_n\)(\(a\leq 10^{18}\)).有一个图用这个方法生成:若\(a_i\)按位与\(a_j\)不为0,则在 ...
- 并不对劲的复健训练-p5212 SubString
题目大意 有一个串\(s\),一开始只知道它的一个前缀.有\(q\)(\(q\leq 10^4\))个操作,操作有两种:1.给一个字符串,表示\(s\)(\(s\)总长\(\leq 6\times 1 ...
- 并不对劲的复健训练-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\ ...
- 并不对劲的复健训练-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 ...
- 并不对劲的复健训练-bzoj5301:loj2534:p4462 [CQOI2018]异或序列
题目大意 给出一个序列\(a_1,...,a_n\)(\(a,n\leq 10^5\)),一个数\(k\)(\(k\leq 10^5\)),\(m\)(\(m\leq10^5\))次询问,每次询问给\ ...
- 并不对劲的复健训练-p3674
题目大意 给出序列$ a_1,...,a_n $ ( $ n\leq10^5,a\leq 10^5 $ ),有\(m\) ( \(m\leq 10^5\))个以下三类询问: (1)给出\(l,r,k\ ...
- 2019NOIP算法复健+学习
前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...
随机推荐
- Visual Studio Code(VS code)介绍
一.日常安利 VS code VS vode特点: 开源,免费: 自定义配置 集成git 智能提示强大 支持各种文件格式(html/jade/css/less/sass/xml) 调试功能强大 各种方 ...
- Mongodb内存管理和使用情况查询
overview MongoDB使用的是内存映射存储引擎,即Memory Mapped Storage Engine,简称MMAP.MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的 ...
- json常用的注解
json注解: 1.@JsonIgnoreProperties: 此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响. 写法将此标签加在model ...
- Oracle中根据列名找到所属的表
oracle中如何根据一个字段名查找出所属的表名? 用如下语句, select * from user_tab_columns where column_name='列名', 例子:select * ...
- EBS登录问题小结
1 网络问题 1)ping IP 2)telnet IP 端口 备注:如果端口能访问则直接跳转,如果不能访问则报错如下所示: 2)配置host文件 如果访问的服务器在内网,则需要配置host信息 3) ...
- mac mysql重置root用户密码
苹果机安装的MySQL后,设置初始密码 引子:.在苹果机上安装的MySQL之后,通过MySQLWorkBench登录本地数据连接,发现没有密码,而在安装MySQL的过程中,是没有设置过密码的其实,刚刚 ...
- 【Java/csv】一个CSV文件解析类(转载)
/*下文写得不错,值得学习**/ import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayLis ...
- ios-runtime拦截touch事件,展示用户触摸效果
[展示效果说明] 对 app 操作录屏时,展示出手指在 app 上的触摸效果可以看到具体点击情况,感觉这样比较直观方便,也不用做视频后期了. 这里简单用 runtime 实现了一个这样的效果,不需要修 ...
- LVS集群
集群: 将许多小的,性能较低的服务器做成一个大的性能高的超级服务器 集群分为负载均衡集群,高可用集群,高性能运算集群 LVS体系结构与工作原理描述 LVS集群负载均衡器接受服务的所有入站客户端计算机请 ...
- div固定在浏览器的最上方,不随滚动条滚动
#topDIV { position: fixed; ; ; width: 100%; height: 35px; border-bottom: 1px solid #eee; background- ...