pyy整队 线段树

问题描述:

众所周知pyy当了班长,服务于民。一天体育课,趁体育老师还没来,pyy让班里n个同学先排好 队。老师不在,同学们开始玩起了手机。站在队伍前端玩手机,前面的人少了,谁都顶不住。于是陆陆 续续有人往队伍最后躲去,但大家都沉迷某骗氪手游,忘记了老师说前面位置有空缺要补齐的要求。一 些同学还时不时地低头问向指挥队伍的班长pyy,排在自己前面成绩最好的同学是谁,这样自己才能心 安理得放心大胆的继续玩手机。 这时老师来了,同学们在可以忽略不计的时间内收好了手机。看着到处充满空缺的队伍,体育老 师勃然大怒并借题发挥,以扬体育组声威,限pyy以最快的时间整顿队伍。由于是体育老师,并看不出 来队伍的位置后移了,老师只关心队伍是否整齐没有空缺。 老师给了pyy一次移动一名同学的权力,因此pyy无法使用技能“向前看齐”。pyy的哥哥强制要求 你帮助pyy回答之前同学们的问题,并告诉pyy在老师来之后,至少移动多少个同学可以使队伍整齐。

输入格式

第一行为两个整数\(n,m(1\le n,m \le 1e5)\),表示有\(n\)位同学,在老师来之前进行了\(m\)次小动作。

第二行为\(n\)个以空格隔开的整数\(a_1,a_2,\cdots a_n(1\le a_i \le 1e7)\),表示初始时队伍中第\(i\)位同学的 年级成绩排名(数据保证不会有两人成绩重复)。

接下来\(m\)行描述同学们的行为,每行由一个字符\(A\)或\(S\)和一个整数\(x\)构成。若为\(A x\),则表示年级成绩排名为\(x\)的同学向pyy询问自己前面成绩最好的是哪位同学;若为\(M x\),则表 示年级成绩排名为\(x\)的同学此时躲到了当前队伍的最尾端(不存在队尾同学躲向队尾)。

输出格式

前\(m\)个操作中对于每个同学的询问,顺序输出所询问同学的年级成绩排名,并以换行隔开。若询问 学生不存在则输出\(-1\)。

最后一行输出至少移动多少位同学,使得队伍整齐。

还是比较简单的线段树题。

对于操作直接用线段树搞就是了,维护一棵下标为队列位置的线段树,对\(A\)操作我们直接查询\([1,pos[x]]\)即可,对于\(M\)我们将原位置单点修改为\(INF\),在队尾修改为\(x\)即可。

麻烦的是最后一个询问,首先肯定不能统计空格数(废话),而是要用一个长度为\(n\)的窗口扫一遍,每次统计需要移动的同学数量来更新答案。考试时打死想不出来,以为还要套个DP,是我太蒻了。

在最后查询队列所有位置状态时,直接写的暴力query,\(O(nlog_n)\)反正也不会TLE,其实可以直接一次\(O(n)\)查询所有叶节点,懒得写了。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define MAXN 100010
  4. using namespace std;
  5. inline int read(){
  6. char ch=getchar();int s=0;
  7. while(ch<'0'||ch>'9') ch=getchar();
  8. while(ch>='0'&&ch<='9') s=s*10+(ch^'0'), ch=getchar();
  9. return s;
  10. }
  11. int n,m,s;
  12. int a[MAXN],a_sort[MAXN];
  13. int idx[MAXN];
  14. int qlast;
  15. int pos[MAXN*2];
  16. #define INF 0x3f3f3f3f
  17. #define sl (x<<1)
  18. #define sr (x<<1|1)
  19. int tre[MAXN*2*4];
  20. void buildt(int x, int l, int r){
  21. tre[x]=INF;
  22. if(l==r) return;
  23. int mid=(l+r)>>1;
  24. buildt(sl, l, mid);
  25. buildt(sr, mid+1, r);
  26. }
  27. void change(int x, int l, int r, int pos, int val){
  28. if(l==r){
  29. tre[x]=val;
  30. return;
  31. }
  32. int mid=(l+r)>>1;
  33. if(pos<=mid) change(sl, l, mid, pos, val);
  34. else change(sr, mid+1, r, pos, val);
  35. tre[x]=min(tre[sl], tre[sr]);
  36. }
  37. int query(int x, int l, int r, int ql, int qr){
  38. if(ql>qr) return INF;
  39. if(ql<=l&&r<=qr){
  40. return tre[x];
  41. }
  42. int mid=(l+r)>>1;
  43. int res=INF;
  44. if(ql<=mid) res=min(res, query(sl, l, mid, ql, qr));
  45. if(mid<qr) res=min(res, query(sr, mid+1, r, ql, qr));
  46. return res;
  47. }
  48. int cnt[MAXN];
  49. int val[MAXN*2];
  50. int main(){
  51. //freopen("queue.in", "r", stdin);
  52. //freopen("queue.out", "w", stdout);
  53. n=read(),m=read();
  54. for(int i=1;i<=n;++i) a[i]=a_sort[i]=read();
  55. sort(a_sort+1, a_sort+1+n);
  56. for(int i=1;i<=n;++i)
  57. idx[i]=lower_bound(a_sort+1, a_sort+1+n, a[i])-a_sort,
  58. pos[idx[i]]=i;
  59. buildt(1, 1, n*2);
  60. qlast=n+1;
  61. for(int i=1;i<=n;++i) change(1, 1, n*2, i, a[i]);
  62. while(m--) {
  63. char opt=getchar();
  64. while(opt!='A'&&opt!='M') opt=getchar();
  65. int t=read();
  66. if(opt=='A'){
  67. int tmp=lower_bound(a_sort+1, a_sort+1+n, t)-a_sort;
  68. int res=query(1, 1, n*2, 1, pos[tmp]-1);
  69. if(res==INF) puts("-1");
  70. else printf("%d\n", res);
  71. }else if(opt=='M'){
  72. int tmp=lower_bound(a_sort+1, a_sort+1+n, t)-a_sort;
  73. change(1, 1, n*2, qlast, t);
  74. change(1, 1, n*2, pos[tmp], INF);
  75. pos[tmp]=qlast;
  76. ++qlast;
  77. }else puts("ERRO");
  78. }
  79. for(int i=1;i<=n*2;++i) val[i]=query(1, 1, n*2, i, i);
  80. int cnt=0;
  81. int ans=0x3f3f3f3f;
  82. for(int i=1;i<=n;++i)
  83. if(val[i]!=INF) ++cnt;
  84. for(int i=2;i+n<=n*2;++i) {
  85. if(val[i-1]!=INF) --cnt;
  86. if(val[i+n-1]!=INF) ++cnt;
  87. ans=min(ans, n-cnt);
  88. }
  89. printf("%d", ans);
  90. return 0;
  91. }

pyy整队 线段树的更多相关文章

  1. luogu4365 秘密袭击 (生成函数+线段树合并+拉格朗日插值)

    求所有可能联通块的第k大值的和,考虑枚举这个值: $ans=\sum\limits_{i=1}^{W}{i\sum\limits_{S}{[i是第K大]}}$ 设cnt[i]为连通块中值>=i的 ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

随机推荐

  1. 为什么重写equals一定要重写hashCode方法?

    大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白. 下面我们看下Objec ...

  2. NetworkInterface网速监测

    private NetworkInterface[] nicArr; //网卡集合 private Timer timer; //计时器 public MainWindow() { Initializ ...

  3. Dubbo -- 四种loadBalance负载均衡算法

    Dubbo中的一个关键接口LoadBalance,dubbo是按照其中的规则来调用多台provider的服务的. 先看一下接口的实现类图: 从上图中我们可以看到dubbo提供了四种算法来实现负载均衡. ...

  4. 手写DAO框架(六)-框架使用示例

    一.引入pom <dependency> <groupId>me.lovegao</groupId> <artifactId>gdao</arti ...

  5. 【hive】centos7下apache-hive-3.1.2-bin的安装测试

    前言:安装hive还是遇见些问题,但还好都解决了,比当初安装配置hadoop-3.2.0容易点...... 正文: 1.下载并安装hive:tar -zxvf apache-hive-3.1.2-bi ...

  6. ASP.NET 取得 Request URL 的各个部分和通过ASP.NET获取URL地址的方法

    网址:http://localhost:1897/News/Press/Content.aspx/123?id=1#toc Request.ApplicationPath / Request.Phys ...

  7. Linux之项目的部署

    前期准备 python3解释器 uwsgi wsgi(web服务网关接口,就是一个实现了python web应用的协议) virtualenvwrapper 路飞的代码 vue的代码 nginx (一 ...

  8. [daily][qemu][kvm] 使用qemu/kvm模拟numa节点

    qemu的配置参数又复杂又难用,man手册写的也是非常对付,很多信息都没有. 而且,竟然遗弃掉旧的配置,换用新的配置.不过这也是好事,说明它在发展,我是欢迎的. 唯一的问题是,要经常跟着它一起更新配置 ...

  9. 解决pycharm新建项目后按钮灰色问题

    解决pycharm新建项目后按钮灰色问题 出现过多次该问题了, 在此记录一下 同样适用于导入别人的新项目后无法运行问题 原因一: pycharm没有设置系统解析器 解决方法一: 打开pycharm-& ...

  10. SpringBoot -基础学习笔记 - 01

    SpringBoot个人笔记-szs 一.使用thymeleaf模板引擎来指定所需资源的位置 可以做到当项目名进行更改后,模板引擎也会进行更新相关的路径;如下图展示,会自动添加crud根目录! < ...