题意:给你两个长度为 n 的序列 a 和 b , 可以对 a 进行 操作: 选择一段区间[ l, r ] ,使得序列a 在这段区间里 按升序排序。 可以对a 进行任意多次操作,问 a是否有可能变成b序列。

解: 首先,枚举b序列,然后在a中,找这个元素在a出现的位置(如果是第一次出现的,就找第一次出现的那个位置,第二次出现就找第二次出现的) pos ,然后查询 0 ~ pos 的最小值 (线段树),若 最小值是 b对应的那个元素,就满足,否则,就不满足。 然后若满足,需要更新线段树,把查询的元素更新为INF,不然会影响后面查询。

/// 试公式的 勿cheat
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define LL long long
#define ULL unsigned long long
#define re register
#define rep(i,j,k) for(re int i=j;i<=k;i++)
#define dep(i,j,k) for(re int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
using namespace std;
const int N = 3e5 + ;
vector<int>G[N];
int a[N], b, du[N]; ///du 代表这个元素出现的 第几次
int rr[N << ];
void pushdown(int root) {
rr[root] = min(rr[root<<], rr[root<<|]);
return ;
}
void built(int l, int r, int root) {
if(l == r) {
rr[root] = a[l]; return ;
}
int mid = (l + r) >> ;
built(l, mid, root << );
built(mid + , r, root << | );
pushdown(root);
}
void updat(int l, int r, int x, int val, int root) {
if(l == r) {
rr[root] = val; return ;
}
int mid = (l + r) >> ;
if(x <= mid) updat(l, mid, x, val, root << );
else updat(mid + , r, x, val, root << | );
pushdown(root);
}
int query(int l, int r, int x, int y,int root) {
if(x <= l && r <= y) return rr[root];
int mid = (l + r) >> ;
int ans = INF;
if(x <= mid) ans = min(ans, query(l, mid, x, y, root << ));
if(y > mid) ans = min(ans, query(mid + , r, x, y, root << | ));
return ans ;
}
int main() {
int t, n;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
rep(i, , n) G[i].clear(), du[i] = ;
rep(i, , n) { scanf("%d", &a[i]); G[a[i]].pb(i); }
built(, n, );
//cout << query(1, n, 2, 4, 1) << endl;
int flag = ;
rep(i, , n) {
scanf("%d", &b);
//if(flag) { cout << i - 1 << endl; continue; }
if(du[b] == (int)G[b].size()) { flag = ; continue; } ///b中这个元素的个数比a中的多,那肯定不满足啦,元素都不完全一样。
int pos = G[b][du[b]];
if(pos == ) flag = ;
//if(pos <= i) continue;
int p = query(, n, , pos, );
if(p != b) flag = ;
updat(, n, G[b][du[b]++], INF, );
}
if(flag) puts("NO");
else puts("YES");
}
return ;
}

Subarray Sorting (线段树)的更多相关文章

  1. hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序

    DZY Loves Topological Sorting Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...

  2. HDU5649 DZY Loves Sorting 线段树

    题意:BC 76 div1 1004 有中文题面 然后奉上官方题解: 这是一道良心的基础数据结构题. 我们二分a[k]的值,假设当前是mid,然后把大于mid的数字标为1,不大于mid的数字标为0.然 ...

  3. CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)

    题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...

  4. 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)

    题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...

  5. 【HDU6602】Longest Subarray【线段树+分治】

    题目大意:给出一串序列,询问最长的合法子串为多长,其中合法子串必须满足子串中[1,C]的数量大于等于K或者为0 题解: 定义右端点为包含某一点所需要的最小区间的右端点 那么初始化时就可以O(n)求出每 ...

  6. 杭电多校第二场1012 L - Longest Subarray ce 线段树

    这题是真的秀...我服了...线段树用好了,感觉什么都可以写... 题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次. 我们对于每一 ...

  7. CCPC-Wannafly Winter Camp Day5 Div1 - Sorting - [线段树]

    题目链接:https://zhixincode.com/contest/22/problem/I?problem_id=314 样例输入 1 5 9 31 5 3 2 41 1 52 1 51 1 1 ...

  8. Longest Subarray(HDU6602+线段树)

    题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于K. 题解->https://blog.csdn.net/Ratina/article/details/97503663 #incl ...

  9. 【HDOJ6602】Longest Subarray(线段树,vector)

    题意:给定一个长为n的序列,第i个数a[i]都是一个[1,c]中的整数 如果一段序列[l,r]中出现过的数字出现次数都>=K则称其为好的序列 求最长的好的序列的长度 n,k,c,a[i]< ...

随机推荐

  1. DVWA reCAPTCHA key: Missing

    修改dvwa文件夹下文件config.inc.php change: $_DVWA[ 'recaptcha_public_key' ] = ' '; $_DVWA[ 'recaptcha_privat ...

  2. 欧拉函数小结 hdu2588+

    从费马小定理到欧拉定理 欧拉公式 再到欧拉函数.,. 小结一下欧拉函数吧 对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)----定义 欧拉函数的基本公式其中pi为x的素因子 ...

  3. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  4. C#进阶之WebAPI(二)

    今天学习一下:WebAPI如何使用呢? 首先我们打开vs新建一个WebAPI项目,可以看到一共有这些文件夹目录 首先了解一下这些文件夹/文件的意义(按照程序启动的流程,相关的配置项就不说了), Glo ...

  5. Pytorch中nn.Conv2d的用法

    Pytorch中nn.Conv2d的用法 nn.Conv2d是二维卷积方法,相对应的还有一维卷积方法nn.Conv1d,常用于文本数据的处理,而nn.Conv2d一般用于二维图像. 先看一下接口定义: ...

  6. Python字符串、组合数据类型练习

    一.Python字符串练习 1.http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html 取得校园新闻的编号. (这个方法就很多了,一般方 ...

  7. java 中 get post

    package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  8. SQL Server 分页SQL

    SELECT * FROM(SELECT ROW_NUMBER() OVER(order by Id DESC)AS rownum, (SELECT COUNT(*) FROM Ana_Strateg ...

  9. 基于Dockerfile搭建JAVA Tomcat运行环境

    前言 在第一篇文字中,我们完全人工方式,一个命令一个命令输入,实现一个java tomcat运行环境,虽然也初见成效,但很累人.如果依靠依靠脚本构建一个Tomcat容器实例,一个命令可以搞定,何乐而不 ...

  10. SAP 选择屏幕的上方 (sscrfields) 按钮设置

    TABLES sscrfields. PARAMETERS: p_carrid TYPE s_carr_id, p_cityfr TYPE s_from_cit. , "激活按钮 . INI ...