传送门

题意

KI先生有收集大量小电影的习惯, 他把他的珍藏理成一大摞。无论何时他想观看这一些电影的一部,他从这一摞电影中找出这一部电影,小心地将其拿出,以确保这一摞电影不会倒塌.

自从那一摞电影变得越来越大,他需要跟踪每一部电影的位置.或许了解每一部电影上面有多少部电影,就足以根据这些信息计算出其在这一摞电影中的位置.由一个印在电影盒子上的数字,可以识别出每一部电影.

那么你的任务就是编写一个跟踪每一部电影位置的程序,特别的,当KI先生从这一摞电影中拿出一部时,你的程序必须打印出在这一部即将被拿出的电影上面电影的数目.

输入

第一行是一个正整数t:输入数据的数量(t<=100),之后每一个测试数据,一行上是两个整数n,m, (1 ≤ n, m ≤ 100000),他们表示这一摞电影的数量和电影查询请求的数量.另一行是有m个整数, a1, . . . , am (1 ≤ ai ≤ n),他们表示KI先生想看的电影,它们需要你去查询定位.

为了简单起见,假设这一摞电影的编号1,2……n按顺序增加,其中这一摞电影最上面的是1号电影.

输出

每一组数据,输出一行整数, 其中第i个整数给出ai号电影在被拿出之前上方的电影的数目。请注意,在每次查询请求ai之后,ai号电影会被放在这一摞电影的顶部

Sample Input
2
3 3
3 1 1
5 3
4 4 5

Sample Output
2 1 0
3 0 4

一道不错的思维题,这道题目的修改和查询操作比较简单,就是在拿出一张电影时,查询在它前面有多少元素,然后把它前面的数的位置都向后移动一位,但是我们如何实现将这张电影放到顶部呢?这不是删除和插入操作吗?然而我不会平衡树啊!!!于是这里有一种十分神奇的做法,可以巧妙的解决这个问题。由于要查询m次,也就是说我们要移动m次电影,所以我们可以开一个大小为(n+m)的树状数组,把每个数的权设为1,开始我们把n个数放在m+1---m+n的区间上,然后每进行一次查询a[i]作我们就将a[i]所在的位置-1,并把a[i]放到最前面,这样只需要不断地将元素前移就可以巧妙的解决问题了。

注意:uva对行末空格十分敏感,所以不能输出多余的空格。

  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<map>
  7. #include<algorithm>
  8. #include<stack>
  9. #include<queue>
  10. #include<vector>
  11. #define maxn 200005
  12. using namespace std;
  13.  
  14. inline int read()
  15. {
  16. int x=,res=;
  17. char c=getchar();
  18. while(c<''||c>'')
  19. {
  20. if(c=='-')
  21. x=-;
  22. c=getchar();
  23. }
  24. while(c>=''&&c<='')
  25. {
  26. res=res*+(c-'');
  27. c=getchar();
  28. }
  29. return res*x;
  30. }
  31.  
  32. int T,n,m,aa;
  33. int c[maxn<<],a[maxn];
  34.  
  35. int low(int x)
  36. {
  37. return x&(-x);
  38. }
  39.  
  40. void add(int x,int y)
  41. {
  42. for(int i=x;i<=n+m;i+=low(i))
  43. {
  44. c[i]+=y;
  45. }
  46. }
  47.  
  48. int ask(int x)
  49. {
  50. int ans=;
  51. for(int i=x;i>;i-=low(i))
  52. {
  53. ans+=c[i];
  54. }
  55. return ans;
  56. }
  57.  
  58. int main()
  59. {
  60. T=read();
  61. while(T--)
  62. {
  63. n=read();m=read();
  64. memset(c,,sizeof(c));
  65. int pd=;
  66. for(int i=m+;i<=m+n;i++)
  67. {
  68. a[i-m]=i;
  69. add(i,);
  70. }
  71. for(int i=;i<=m;i++)
  72. {
  73. aa=read();
  74. if(pd==)
  75. {
  76. pd=;
  77. }
  78. else
  79. {
  80. printf(" ");
  81. }
  82. printf("%d",ask(a[aa]-));
  83. add(a[aa],-);
  84. a[aa]=(m+-i);
  85. add(a[aa],);
  86. }
  87. printf("\n");
  88. }
  89. return ;
  90. }

UVA1513 Movie collection的更多相关文章

  1. Java基础Collection集合

    1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:

  2. Collection集合

    一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...

  3. iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.

    崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...

  4. [Java Collection]List分组之简单应用.

    前言 今天有一个新需求, 是对一个List进行分组, 于是便百度到一些可用的代码以及我们项目使用的一些tools, 在这里总结下方便以后查阅. 一: 需求 现在我们一个数据库表t_series_val ...

  5. Java Collection开发技巧

    Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...

  6. 浅谈Collection集合

    俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...

  7. Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?

    Model和Collection和后台的WEB server进行数据同步非常方便, 都只需要在实行里面添加一url就可以了,backbone会在model进行save或者collection进行cre ...

  8. Collection和Collections的区别?

    Collection 是接口(Interface),是集合类的上层接口. Collections是类(Class),集合操作的工具类,服务于Collection框架.它是一个算法类,提供一系列静态方法 ...

  9. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

随机推荐

  1. 2 数据分析之Numpy模块(1)

    Numpy Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包.它是我们课程所介绍的其他高级工具的构建基础. 其部分功能如下: ndarray, 一个具有复杂广播能 ...

  2. 部署个人wordpress 笔记

    yum list installed | grep php #检查当前安装的PHP包yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 ... ...

  3. XP_CMDSHELL 执行命令添加 windows 用户的方法

    1. 之前看过不少文档 可以使用 xp_SQLCMD的命令来进行渗透处理, 今天因为公司的服务器又中毒了 自己学习了下. 2. 修改SQLSERVER的设置 远程登录数据库 sqlcmd -S 10. ...

  4. Zabbix 3.0的前端默认在Centos 6上不支持

    由于PHP版本的原因,RHEL 6上的Zabbix前端不受支持. 由于Zabbix 3.0的要求是PHP 5.4.0或更高版本,而RHEL 6最新版本是5.3.3. 在大多数情况下,Zabbix服务器 ...

  5. Python 字符编码及其文件操作

    本章节内容导航: 1.字符编码:人识别的语言与机器机器识别的语言转化的媒介. 2.字符与字节:字符占多少个字节,字符串转化 3.文件操作:操作硬盘中的一块区域:读写操作 注:浅拷贝与深拷贝 用法: d ...

  6. CentOS下添加Root权限用户(超级用户)方法

    1.添加普通用户[root@server ~]# useradd chenjiafa   //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa   ...

  7. VScode中python环境配置

    vscode中python环境配置 想要在vscode中运行python代码必须要告诉vscode使用哪个解释器才行 方法1. 打开命令面板(Ctrl+Shift+P)输入Python: Select ...

  8. photoshop编辑pdf文件

    对于PDF文件透明背景的问题 PDF文件背景是透明的,如何使其变成白色 怎样通过photoshop打开多页PDF,编辑后仍保存为多页 注意shift全选,"页面选项"处的'裁剪到' ...

  9. 高斯消元(Gauss消元)

    众所周知,高斯消元可以用来求n元一次方程组的,主要思想就是把一个n*(n+1)的矩阵的对角线消成1,除了第n+1列(用来存放b的)的其他全部元素消成0,是不是听起来有点不可思议??! NO NO NO ...

  10. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...