实验室外的攻防战 UOJ#180 [树状数组]

题目

时针指向午夜十二点,约定的日子——2月28日终于到来了。随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks\) 博士所在的实验室。

当然,\(picks\) 博士不会坐以待毙,他早就率领着他的猴子们在实验室外修筑了许多的坚固防御工事。

经过跳蚤侦察兵的勘察,跳蚤国王发现 \(picks\) 博士的防御工事有着 \(n\) 处薄弱点,于是他把他的跳蚤大军分成了 \(n\) 支小队,并打算让它们分别进攻每一个薄弱点。但是因为战场混乱,这 \(n\) 支小队的位置被打乱了,重新整队之后,跳蚤国王发现第 \(i\) 个位置的小队编号为 \(A_i\)(显然 \(A\) 是一个排列)。

经过计算,跳蚤国王发现,让第 \(i\) 个位置的小队编号为 \(B_i\) 时,他的军队可以发挥出最大的战斗力(保证 \(B\) 也是一个排列)。

跳蚤国王可以发出指令来改变小队们的排列顺序,每一次,他都会报出一个整数 \(i\ (1\leqslant i< n)\) 。如果排在第 \(i\) 个位置的小队编号大于第 \(i+1\) 个位置的小队,那么这两支小队会交换顺序,否则这一个命令将会被忽略。

现在跳蚤国王希望他的军队能够发挥出最强大的战斗力,于是他想要知道是否存在一种指令序列,使得小队们可以按照排列 \(B\) 的方式排列。

但是因为小队数目实在是太多,跳蚤国王一时间也没有看出答案。于是他派跳蚤绑架来了你——这附近最著名的民间科学家来帮他计算这个问题的答案。

输入格式

输入数据第一行包含一个正整数 \(n\) 。

接下来两行每行 \(n\) 个正整数,分别描述排列 \(A\) 和排列 \(B\) 。

输出格式

对于每组数据,如果存在这样的指令序列,输出YES,否则输出NO(引号不输出,请注意大小写)。

样例

样例输入1

  1. 3
  2. 2 3 1
  3. 2 1 3

样例输出1

  1. YES

explanation

只要报出 \(2\) ,也就是交换第 \(2\) 个位置和第 \(3\) 个位置的小队即可。

样例输入2

  1. 3
  2. 2 1 3
  3. 3 1 2

样例输出2

  1. NO

explanation

注意只有相邻的满足前一个数大于后一个数的情况下才可以交换。

样例输入3

  1. 5
  2. 4 1 2 5 3
  3. 1 2 4 3 5

样例输出3

  1. YES

explanation

步骤如下(每次交换的两个数加粗表示):

4 1 2 5 3

1 4 2 5 3

1 2 4 5 3

1 2 4 3 5

样例输入4

  1. 5
  2. 1 5 3 4 2
  3. 1 2 4 3 5

样例输出4

  1. NO

样例输入5

  1. 8
  2. 8 2 7 4 5 3 6 1
  3. 2 8 5 7 4 3 6 1

样例输出5

  1. NO

限制与约定

子任务 分值 限制与约定
1 24 \(n\leqslant 8\)
2 32 \(n\leqslant 1000\)
3 44 \(n\leqslant 100000\)

对于所有数据,\(1\leqslant n\leqslant 100000\) ,保证输入的 \(A\) 和 \(B\) 均为一个排列。

时间限制:\(1\ s\)

空间限制:\(256MB\)

分析

又是一个偏序的题,给出一个 \(A\) 序列,让你判断能否通过符合要求的转换,使其转化成 \(B\) 序列。

我们可以得到这样一个结论:设有两个值 \(i\),\(j\) 满足 \(i<j\) ,如果 \(posa_i < posa_j\) 并且 \(posb_i > posb_j\),那么这种情况一定是不成立的。证明就是要想从左移到右边,必须满足 \(i>j\) 但是这里 \(i<j\) ,所以一定是不成立的。那么我们就可以用树状数组来维护一下。

我们记录下来每个值的位置,并且在修改的时候以 \(A\) 序列中的位置作为下标, \(B\) 序列中的位置作为值,维护一个最大值。这样我们在查询的时候枚举数值,每一次查询 \(A\) 序列中值的位置,查询到的结果就是 \(i<j\) 且 \(posa_i < posa_j\) 的最大的 \(posb_j\) 这样我们只需要比较一下这个值和当前枚举到的 \(i\) 值的 \(posb_i\) ,就能得到答案。

代码

  1. #include<cstdio>
  2. //以下好多行都是卡常
  3. const int L=1<<20;
  4. char buffer[L],*S,*T;
  5. #define lowbit(x) (x & -x)
  6. #define getchar() (S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T)?EOF:*S++)
  7. #define inline __inline__ __attribute__((__always_inline__))
  8. #define max(a,b) (a>b?a:b)
  9. #define re register
  10. //从这里开始正经
  11. const int maxn = 1e5+10;
  12. int n;
  13. int t[maxn];
  14. int posa[maxn],posb[maxn];
  15. inline int read(){
  16. re int s = 0,f = 1;
  17. re char ch = getchar();
  18. while(ch < '0' || ch > '9'){
  19. if(ch == '-')f = -1;
  20. ch = getchar();
  21. }
  22. while(ch >= '0' && ch <= '9'){
  23. s = (s<<3) + (s<<1) + ch - '0';
  24. ch = getchar();
  25. }
  26. return s * f;
  27. }
  28. inline void modify(re int x,re int val){//树状数组维护最大值
  29. while(x <= n){
  30. t[x] = max(t[x],val);
  31. x += lowbit(x);
  32. }
  33. }
  34. inline int query(re int x){//查询
  35. re int ans = 0;
  36. while(x){
  37. ans = max(ans,t[x]);
  38. x -= lowbit(x);
  39. }
  40. return ans;
  41. }
  42. int main(){
  43. n = read();
  44. for(re int i=1;i<=n;++i){//记录值在A序列中的位置
  45. posa[read()] = i;
  46. }
  47. for(re int i=1;i<=n;++i){//记录值在B序列中的位置
  48. posb[read()] = i;
  49. }
  50. for(re int i=1;i<=n;++i){//枚举数值,依次查询A序列中i的位置
  51. if(query(posa[i]) > posb[i]){//如果有上边所说的冲突情况直接NO
  52. puts("NO");
  53. return 0;
  54. }
  55. modify(posa[i],posb[i]);
  56. }
  57. puts("YES");//没有输出NO就是合法的
  58. return 0;
  59. }

实验室外的攻防战 UOJ#180 [树状数组]的更多相关文章

  1. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组

    题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...

  2. 【UR #12】实验室外的攻防战(BIT)

    [题目链接] http://uoj.ac/problem/180 [题意] 给定两个1..n的排列AB,只有当ai<ai+1才能交换ai和ai+1,问是否能够将A转换为B. [思路] 令a[i] ...

  3. 【UR #12】实验室外的攻防战

    UOJ小清新题表 题目内容 依然没有粘题面主要是UOJ的题面都太长了qwq UOJ链接 一句话题意:给出两个序列 \(A\) 和 \(B\),对于 \(A\) 进行若干次操作,每次给出一个 \(i\) ...

  4. 学长小清新题表之UOJ 180.实验室外的攻防战

    学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...

  5. UOJ 180【UR #12】实验室外的攻防战

    http://uoj.ac/contest/25/problem/180 从前往后对比串A,B 当$A_i,B_i$不相同时找到$B_i$在A中的位置j 若$min{A_1,A_2,A_3...... ...

  6. UOJ【UR #12】实验室外的攻防战

    题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...

  7. UOJ180 【UR #12】实验室外的攻防战

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  9. [UOJ#334][NOIP2017]列队 平衡树/线段树/树状数组

    题目链接 题意不说了,一辈子也忘不掉 解法1.平衡树 这题就是平衡树裸题,每一行开一棵维护前 \(m-1\) 个,最后一列单独维护,因为很多人没有用到,所以平衡树每个节点是一个区间(pair),分裂时 ...

随机推荐

  1. Git 推送到远程仓库

    github:https://github.com/ 国内的:https://gitee.com/ (和Github非常相似的) 一.Http方式进行推送 右击同步,配置远端,将URL替换成远程仓库的 ...

  2. JS内存机制

    在看JS内存机制之前我们先来看一下JS是门什么样的语言,他又有哪些变量类型. 动静态,强弱类型 静态:在使用之前就需要确认其变量数据类型. 动态:在运行过程中需要检查数据类型. 强类型:不支持隐式类型 ...

  3. css的一些小技巧。修改input样式

    在第一次正式写项目的时候,遇到了几个布局的小技巧.记录一下. 我们常常会遇到图片和文字对齐的一种样式.比如 这样的样式,我们写的时候有时候会出现不对齐的情况.我们有俩种方法 一种就是flex的布局,还 ...

  4. java基础(九)--方法重载

    如System.out.println()方法即是方法重载的. 以下举例说明自定义sum()方法的重载 package cnblogs; public class TestBase09MathRelo ...

  5. pandas处理excel文件和csv文件

    一.csv文件 csv以纯文本形式存储表格数据 pd.read_csv('文件名'),可添加参数engine='python',encoding='gbk' 一般来说,windows系统的默认编码为g ...

  6. java动态代理——字段和方法字节码的基础结构及Proxy源码分析三

    前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  7. Day02_企业权限管理(SSM整合)

    学于黑马程序员和传智播客联合做的教学项目 感谢 黑马程序员官网 传智播客官网 个人根据教程的每天的工作进度的代码和资料 密码:cti5 b站在线视频 微信搜索"艺术行者",关注并回 ...

  8. 社交网站的数据挖掘与分析pdf版本|网盘下载地址附提取码|

    点击此处进入网盘下载地址 提取码:btqx 作者介绍: 马修·罗塞尔(MatthewA.Russell),DigitalReasoningSystems公司的技术副总裁和Zaffra公司的负责人,是热 ...

  9. 21天速成python电子书pdf|超级厉害的书内附百度云链接可直接下载|

    python的学习书籍小编看过很多,但是这本<21天学通python>真的是堪称极品!本书的作者团队成员为一线开发工程师.资深编程专家或专业培训师,在编程开发方面有着丰富的经验,并已出版过 ...

  10. Skill 脚本演示 ycAlignAll.il

    https://www.cnblogs.com/yeungchie/ ycAlignAll.il 将版图整体对齐至 指定象限 / 原点,可以忽略 Label 干扰带来的 offGrid 的风险. 回到 ...