说实话,$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. 明解JAVA 第二章答案

    练习2-1 编译错误,无法运行. 练习2-2 package candle1220; class Nightwatch{ public static void main(String[] args) ...

  2. Java-100天知识进阶-GC算法-知识铺(五)

    知识铺: 致力于打造轻知识点,持续更新每次的知识点较少,阅读不累.不占太多时间,不停的来唤醒你记忆深处的知识点. GC算法 1.标记清除算法 优缺点:不需要额外空间,但是遍历空间花费大,而且会产生大量 ...

  3. linux安装redis步骤

    1.安装gcc  redis是c语言编写的 -- 安装命令 yum install gcc-c++ -- 检查gcc 是否安装 gcc -v 2.下载redis安装包,在root目录下执行 wget ...

  4. IIS_CVE-2015-1635-HTTP.SYS远程执行代码漏洞复现

    CVE-2015-1635-HTTP.SYS远程执行代码漏洞复现 一.漏洞描述 远程执行代码漏洞存在于 HTTP 协议堆栈 (HTTP.sys) 中,当 HTTP.sys 未正确分析经特殊设计的 HT ...

  5. SQLMap常用教程

    先安装 python环境(2.6.x或2.7版本) ,再将SQLMap 放在安装目录下 注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql ...

  6. java SSM 框架 微信自定义菜单 快递接口 SpringMVC mybatis redis shiro ehcache websocket

    A 调用摄像头拍照,自定义裁剪编辑头像,头像图片色度调节B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成 ...

  7. 面向对象的六大原则之 接口隔离原则——ISP

    ISP = Interface Segregation Principle   ISP的定义如下: 1.客户端不应该依赖他不需要的接口 2.一个类对另外一个类的依赖性应该是建立在最小的接口上 3.不应 ...

  8. LNMP环境下搭建SVN服务

    最近自己买了个服务器,试着在上面搭建了LNMP环境,因为以前在本地用MAMP Pro搭建过LAMP环境,所以基本上还算是轻车熟路,第一次搭建LNMP,使用的是一键安装,过程是顺利的,后来在使用过程中遇 ...

  9. ES6之Proxy 的巧用

    摘要: Proxy的骚操作. 作者:前端小智 原文:Proxy 的巧用 Fundebug经授权转载,版权归原作者所有. Proxy 介绍 使用Proxy,你可以将一只猫伪装成一只老虎.下面大约有6个例 ...

  10. F5部署SSL证书

    查找中间证书 为了保证可以兼容所有浏览器,我们必须在服务器上安装中间证书,请到 中间证书下载工具,输入您的Server.cer,然后下载中间证书,请将中间证书保存为Chain.cer. 证书文件的上传 ...