UVA1513 Movie collection
传送门
题意
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对行末空格十分敏感,所以不能输出多余的空格。
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#define maxn 200005
using namespace std; inline int read()
{
int x=,res=;
char c=getchar();
while(c<''||c>'')
{
if(c=='-')
x=-;
c=getchar();
}
while(c>=''&&c<='')
{
res=res*+(c-'');
c=getchar();
}
return res*x;
} int T,n,m,aa;
int c[maxn<<],a[maxn]; int low(int x)
{
return x&(-x);
} void add(int x,int y)
{
for(int i=x;i<=n+m;i+=low(i))
{
c[i]+=y;
}
} int ask(int x)
{
int ans=;
for(int i=x;i>;i-=low(i))
{
ans+=c[i];
}
return ans;
} int main()
{
T=read();
while(T--)
{
n=read();m=read();
memset(c,,sizeof(c));
int pd=;
for(int i=m+;i<=m+n;i++)
{
a[i-m]=i;
add(i,);
}
for(int i=;i<=m;i++)
{
aa=read();
if(pd==)
{
pd=;
}
else
{
printf(" ");
}
printf("%d",ask(a[aa]-));
add(a[aa],-);
a[aa]=(m+-i);
add(a[aa],);
}
printf("\n");
}
return ;
}
UVA1513 Movie collection的更多相关文章
- Java基础Collection集合
1.Collection是所有集合的父类,在JDK1.5之后又加入了Iterable超级类(可以不用了解) 2.学习集合从Collection开始,所有集合都继承了他的方法 集合结构如图:
- Collection集合
一些关于集合内部算法可以查阅这篇文章<容器类总结>. (Abstract+) Collection 子类:List,Queue,Set 增: add(E):boolean addAll(C ...
- iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.
崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...
- [Java Collection]List分组之简单应用.
前言 今天有一个新需求, 是对一个List进行分组, 于是便百度到一些可用的代码以及我们项目使用的一些tools, 在这里总结下方便以后查阅. 一: 需求 现在我们一个数据库表t_series_val ...
- Java Collection开发技巧
Java Collection(集合) 集合中的一些技巧: 通过Collections类的静态方法,可以对集合进行一些操作 1 java.util.List<Integer> number ...
- 浅谈Collection集合
俗话说:一个东西,一件事都离不开三句话:"是什么,为什么,怎么办" 集合是什么: 集合简单的说一个数组集合的高级体现,用来存储数据或对象的容器: 集合为什么存在: 集合只是体现了对 ...
- Backbone中的model和collection在做save或者create操作时, 如何选择用POST还是PUT方法 ?
Model和Collection和后台的WEB server进行数据同步非常方便, 都只需要在实行里面添加一url就可以了,backbone会在model进行save或者collection进行cre ...
- Collection和Collections的区别?
Collection 是接口(Interface),是集合类的上层接口. Collections是类(Class),集合操作的工具类,服务于Collection框架.它是一个算法类,提供一系列静态方法 ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
随机推荐
- 【学习总结】Git学习-参考廖雪峰老师教程-总
公元2018-10-21 实验室台式机 win7 64位 参考教程: 廖雪峰Git教程 其他资料:Git-book 北大一只总结的笔记,最终整理的时候可以参考:Git笔记 评论区看到的另一个人,总结在 ...
- Flask中使用数据库连接池 DBUtils ——(4)
DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程 ...
- ASP.NET MVC系列:web.config中ConnectionString aspnet_iis加密与AppSettings独立文件
1. web.config中ConnectionString aspnet_iis加密 web.config路径:E:\Projects\Libing.Web\web.config <conne ...
- Linux 学习 (三) 文件搜索命令
Linux达人养成计划 I 学习笔记 locate 文件名 搜索速度比较快 只能根据文件名搜索 搜索的是保存在 /var/lib/mlocate 的数据库(每天更新一次) 新建文件需要执行 updat ...
- 使用css实现无滚动条滚动+使用插件自定义滚动条样式
使用css实现无滚动条滚动,摘抄自:曹小萌博客 使用css实现无滚动条滚动,大体思路是在div外面再套一个div.这个div设置overflow:hidden.而内容div设置 overflow-x: ...
- Python--Linux上安装Python
Linux 上安装 Python 官网下载:https://www.python.org/downloads/ 本文安装包下载链接:https://pan.baidu.com/s/1uL2JyoY_g ...
- TypeScript体系调研报告
作者简介:aoto 蚂蚁金服·数据体验技术团队 Q:为什么要写这边文章?这篇文章要表达什么? A:我们考虑在SPA应用中使用TS作为开发语言,我们需要一篇系统性介绍TS本身及周边的文章来论证在项目中使 ...
- plink合并文件并更新SNP位置(merge file, update SNP position)
一.合并文件 plink合并文件需要用到“merge”参数 如果是ped和map格式文件,则用以下命令: plink --file data1 --merge data2.ped data2.map ...
- Java基础 -- final关键字
在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们来了解一下final ...
- 关于ehcache缓存中eternal及timeToLiveSeconds和timeToIdleSeconds的说明
今天发现开发项目启动时有警告提示:cache 'xx' is set to eternal but also has TTL/TTI set,发现是ehcache缓存设置冲突 所以决定在此mark一下 ...