Subarray Sorting (线段树)
题意:给你两个长度为 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 (线段树)的更多相关文章
- hdu 5195 DZY Loves Topological Sorting 线段树+拓扑排序
DZY Loves Topological Sorting Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
- HDU5649 DZY Loves Sorting 线段树
题意:BC 76 div1 1004 有中文题面 然后奉上官方题解: 这是一道良心的基础数据结构题. 我们二分a[k]的值,假设当前是mid,然后把大于mid的数字标为1,不大于mid的数字标为0.然 ...
- CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)
题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...
- 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
- 【HDU6602】Longest Subarray【线段树+分治】
题目大意:给出一串序列,询问最长的合法子串为多长,其中合法子串必须满足子串中[1,C]的数量大于等于K或者为0 题解: 定义右端点为包含某一点所需要的最小区间的右端点 那么初始化时就可以O(n)求出每 ...
- 杭电多校第二场1012 L - Longest Subarray ce 线段树
这题是真的秀...我服了...线段树用好了,感觉什么都可以写... 题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次. 我们对于每一 ...
- 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 ...
- Longest Subarray(HDU6602+线段树)
题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于K. 题解->https://blog.csdn.net/Ratina/article/details/97503663 #incl ...
- 【HDOJ6602】Longest Subarray(线段树,vector)
题意:给定一个长为n的序列,第i个数a[i]都是一个[1,c]中的整数 如果一段序列[l,r]中出现过的数字出现次数都>=K则称其为好的序列 求最长的好的序列的长度 n,k,c,a[i]< ...
随机推荐
- ELK-全过程搭建
环境说明:软件包我都 给你们放/usr/local/src/elk目录下安装目录都放在/usr/local/下数据都放在/data0/elk/目录下日志都放在/data0/logs/elk目录下系统 ...
- Web前端开发JavaScript基础
JavaScript 一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,它的解释器被称为JavaScript引擎,是浏览器的一部分,并且是被广泛用于客户端的脚本语言,JavaS ...
- go install
go get使用时的附加参数 使用 go get 时可以配合附加参数显示更多的信息及实现特殊的下载和安装操作,详见下表所示. go get 使用时的附加参数 附加参数 备 注 -v 显示操作流程的日志 ...
- Bootstrap3基础教程 03 导航栏
Bootstrap导航栏 创建一个默认的导航栏的步骤如下: 1.向 <nav> 标签添加 class .navbar..navbar-default. 2.向上面的元素添加 role=&q ...
- Swagger学习(一、入门)
简单 入门(效果) SwaggerConfig.class @Configuration //变成配置文件 @EnableSwagger2 //开启swagger2 public class Swag ...
- Python活力练习Day7
Day7:写出一个程序,接受一个由字母和数字组成的字符串和一个字符,输出输入字符串中含有该字符的个数,不区分大小写 eg:input : a = '123ASVFBVESS' b = 's' out ...
- vue入门:(条件渲染)
v-if v-show v-else 一.v-if:生成或者移出一个元素 <div id="example"> <button v-on:click=" ...
- Nginx作为静态资源web服务之文件读取
Nginx作为静态资源web服务之文件读取 文件读取会使用到以下几个配置 1. sendfile 使用nginx作为静态资源服务时,通过配置sendfile可以有效提高文件读取效率,设置为on表示启动 ...
- Linux下的打包操作
范例一:将整个 test 目录下的文件全部打包成为 test.tar[python@master ~]$ tar -cvf test.tar test/ ==仅打包,不压缩!test/ ...
- deep_learning_Function_sklearn的train_test_split()
sklearn的train_test_split train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: X_tra ...