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]< ...
随机推荐
- Yii2.0 组件
框架之所以是框架,是因为其强大,其封装了很多实用的功能,开发者可以开箱即用. 下边列举Yii2.0的部分组件: var_dump(Yii::$app->session->getId()); ...
- java 序列化和反序列化的底层实现原理
出处:序列化和反序列化的底层实现原理是什么? 一.基本概念1.什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过 ...
- vue 换肤
/* eslint-disable */ // 设置文件 import setting from "@/setting.js"; const themeList = setting ...
- 题解 P2879 【[USACO07JAN]区间统计Tallest Cow】
题目链接: https://www.luogu.org/problemnew/show/P2879 思路: 先不管最大高度,我们读入一对x,y.说明,x+1~y-1之间牛的身高都小于x,y. 然后不妨 ...
- O046、掌握Cinder 的设计思想
参考https://www.cnblogs.com/CloudMan6/p/5578673.html 从 volume 创建流程看 cinder-* 子服务如何协同工作 对于 Cinder ...
- ASP.NET中TextBox控件设立ReadOnly="true"后台取不到值
SP.NET中TextBox控件设置ReadOnly="true"H或Enabled=false后台取不到值 当TextBox设置了ReadOnly="true" ...
- vue使用scss应该安装哪些依赖
通过vue-cli搭建的项目如果想使用scss的话除了安装sass-loader,还需要安装node-sass cnpm install sass-loader node-sass -D
- Java经典基础与高级面试36题和答案
1.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法? “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实 ...
- Java List集合深入学习
List: https://blog.csdn.net/qq_37939251/article/details/83499291 https://blog.csdn.net/weixin_403043 ...
- Go学习笔记【一、概述】
工作需要,即将要把部分查询计算的逻辑翻译成Go语言,来提升查询效率 在此需要对Go语言进行学习,先把入门教程浏览了一遍,发现有些语法和C很类似,还有部分类似于Python,还没有深入学习,先开个坑,业 ...