说实话,$2200$ 的题做不出来也有点丢脸了……

当然要先判所有数出现次数相同。

首先区间排序就相当于交换相邻两个数,前面的数要大于后面的数才能交换。

然后就不会了……

我们考虑 $b_1$ 到 $b_{i-1}$ 都已经归位了,现在要把 $b_i$ 归位。

找到其在 $a$ 中下一次出现的位置(设为 $p$)。发现只有当 $a_p$ 是 $a_i$ 到 $a_p$ 的最小值时,才能归到。

具体代码实现时不会改变 $a$ 的位置,那怎么判断最小值呢?发现已经归位的数对最小值没有贡献,可以归位后就变成 INF。然后询问 $1$ 到 $p$ 的最小值即可。

时间复杂度 $O(n\log n)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int t,n,a[maxn],b[maxn],ta[maxn],tb[maxn],mn[maxn*],len[maxn];
vector<int> at[maxn];
inline void pushup(int o){
mn[o]=min(mn[o<<],mn[o<<|]);
}
void build(int o,int l,int r){
if(l==r) return void(mn[o]=a[l]);
int mid=(l+r)>>;
build(lson);build(rson);
pushup(o);
}
void update(int o,int l,int r,int p,int v){
if(l==r) return void(mn[o]=v);
int mid=(l+r)>>;
if(mid>=p) update(lson,p,v);
else update(rson,p,v);
pushup(o);
}
int query(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return mn[o];
int mid=(l+r)>>,ans=2e9;
if(mid>=ql) ans=min(ans,query(lson,ql,qr));
if(mid<qr) ans=min(ans,query(rson,ql,qr));
return ans;
}
int main(){
t=read();
while(t--){
bool flag=true;
n=read();
FOR(i,,n) ta[i]=a[i]=read(),at[a[i]].push_back(i);
FOR(i,,n) tb[i]=b[i]=read();
sort(ta+,ta+n+);sort(tb+,tb+n+);
FOR(i,,n) if(ta[i]!=tb[i]){puts("NO");flag=false;break;}
if(!flag){
FOR(i,,n) at[i].clear(),len[i]=;
continue;
}
build(,,n);
FOR(i,,n){
int p=at[b[i]][len[b[i]]++];
if(query(,,n,,p)!=b[i]){puts("NO");flag=false;break;}
update(,,n,p,2e9);
}
if(flag) puts("YES");
FOR(i,,n) at[i].clear(),len[i]=;
}
}

CF1187D Subarray Sorting(神奇思路,线段树)的更多相关文章

  1. [火星补锅] siano 神奇的线段树

    前言: 本来以为很难打的,没想到主干一次就打对了,然而把输入的b和d弄混了,这sb错误调了两个小时... 解析: 神奇的线段树.注意到有一个性质,无论怎么割草,生长速度快的一定不会比生长速度慢的矮.因 ...

  2. 2019.01.22 hdu5195 DZY Loves Topological Sorting(贪心+线段树)

    传送门 题意简述:给出一张DAGDAGDAG,要求删去不超过kkk条边问最后拓扑序的最大字典序是多少. 思路:贪心帮当前不超过删边上限且权值最大的点删边,用线段树维护一下每个点的入度来支持查询即可. ...

  3. CF1187D Subarray Sorting

    思路: 线段树好题.对a数组中的每个元素从左到右依次操作,判断最终是否能够转化成b数组.在此过程中使用线段树维护区间最小值判断是否能够进行合法操作. 实现: #include <bits/std ...

  4. 【HDU5869】 Different GCD Subarray Query 题解 (线段树维护区间GCD)

    题目大意:求区间$[L,R]$中所有子区间产生的最大公因数的个数. ------------------------- 对于$gcd$,我们知道$gcd(a,b,c)=gcd(gcd(a,b),c)$ ...

  5. CodeForces-213E:Two Permutations(神奇的线段树+hash)

    Rubik is very keen on number permutations. A permutation a with length n is a sequence, consisting o ...

  6. UOJ 418 【集训队作业2018】三角形——思路+线段树合并

    题目:http://uoj.ac/problem/418 看了题解才会…… 很好的想法是把整个过程看成若干 “取一点 i ,值+=w[ i ],值-=\(\sum w[j]\)”(其中 j 是 i 的 ...

  7. 【Luogu】P3521ROT-Tree Rotations(线段树合并)

    题目链接 神奇的线段树合并qwq   不过就思路而言很好想…… 观察到一棵树无论怎么交换两棵左右子树,子树内部的最优逆序对并没影响……决策只影响左右子树之间的逆序对…… 于是线段树合并直接乱搞就好啦 ...

  8. HDU 1698 Just a Hook (线段树区间更新)

    题目链接 题意 : 一个有n段长的金属棍,开始都涂上铜,分段涂成别的,金的值是3,银的值是2,铜的值是1,然后问你最后这n段总共的值是多少. 思路 : 线段树的区间更新.可以理解为线段树成段更新的模板 ...

  9. [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】

    题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...

随机推荐

  1. (三十三)golang--面向对象之继承

    继承可以解决代码复用: 实现:只需要在结构体中嵌套一个匿名结构体: 结构体可以使用匿名结构体中所有字段核方法:无论是大写还是小写: 可以简化访问匿名结构体中的属性和方法: 当该结构体和匿名结构体有相同 ...

  2. 《一起学mysql》3

    索引和查询优化   为什么要索引? 想想我们上小学的时候是怎么查字典的,比方查 理想的 “理”,首先在索引里找到声母 “l”,再找到 “li” 找到 “li”所在的页数,   我们之前建的所有mysq ...

  3. 入门理解mysql-binlog

    mysql-binlog简介: mysql的二进制日志记录了所有DDL和DML(除select) 开启binlog日志后会有1%左右的的性能损耗 二进制日志包括两类 索引文件 XXXX.index 日 ...

  4. 【shell脚本】定时备份日志===logBackup.sh

    定时备份日志 设置执行权限 [root@VM_0_10_centos shellScript]# chmod a+x logBackup,sh 脚本内容 [root@VM_0_10_centos sh ...

  5. 2019.11.21 做OJ题的反思

    1.利用二分法查找数组元素(适用于有序数组) #include<stdio.h> int BinarySearch(int a[],int n,int key); ]; int main( ...

  6. Dubbo从入门到实战:入门篇

    很多时候,其实我们使用这个技术的时候,可能都是因为项目需要,所以,我们就用了,但是,至于为什么我们需要用到这个技术,可能自身并不是很了解的,但是,其实了解技术的来由及背景知识,对于理解一项技术还是有帮 ...

  7. 安装docker后修改docker文件目录

    docker会下载容器,运行会挂载磁盘,所以我们需要把docker装在大容量的分区. 安装 https://docs.docker.com/install/linux/docker-ce/centos ...

  8. 【mybatis】mybatis传参的几种方式

    参考地址: https://my.oschina.net/liuzelin/blog/2966633

  9. 通俗的讲,就是高层模块定义接口,低层模块负责实现。 Bob Martins对DIP的定义: 高层模块不应依赖于低层模块,两者应该依赖于抽象。 抽象不不应该依赖于实现,实现应该依赖于抽象。

    通俗的讲,就是高层模块定义接口,低层模块负责实现. Bob Martins对DIP的定义: 高层模块不应依赖于低层模块,两者应该依赖于抽象. 抽象不不应该依赖于实现,实现应该依赖于抽象. 总结出使用D ...

  10. 一款好用的SSH工具“FinalShell”

    FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求. 特色功能:免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网 ...