看题传送门

题目大意:XXX喜欢看电影,他有好多好多的影碟,每个影碟都有个独立的编号。开始是从下往上影碟的顺序是n~1,他每次拿出影碟的时候,你需要输出压在该影碟上的有几个。(拿出后其他影碟顺序不变)看完影碟后,XXX会把影碟放在最上面。

感冒了,不好玩T T

这题依旧是Fenwick树的应用。

但是有点奇怪是吗?我们要如何表示出来?

我们可以取向上为正方向。(→_→喂,我不是在做物理,我不要受力分析~\(≧▽≦)/~)

然后呢?Position[ 1 ]存的是n 也就是倒序存,为什么这么做呢?可以这么想,Position[ index] 这个数组,Index 就是影碟的编号,而里面存的内容越大,表示越在上面。

那么C[x]呢,存的是x到底部的距离。(最底下的为1)

好,那么当他要拿出影碟(编号为id)的时候,我们就可以直接用position[id] 获取他的位置并且用Fenwick来计算答案t了,此时t是到底部距离,需要n-t

之后放到顶部呢?

编号大于id的才需要-1(即压在id上的) ,所以直接update(position[id],-1)即可。

详见代码吧。

#include<cstdio>
const int MAXN=200000+10;
int position[MAXN],C[MAXN]; inline int lowbit(int x)
{
return x&(-x);
} void update(int x,int d)
{
while(x<=MAXN)
{
C[x]+=d;
x+=lowbit(x);
}
} int sum(int x)
{
int ans=0;
while(x>0)
{
ans+=C[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)
position[i]=n-i+1; //取向上为正方向。→_→你在做物理?
for(int i=1;i<MAXN;i++)
C[i]=lowbit(i); //C记录到底部距离 int top=n;
for(int i=0;i<m;i++)
{
int id;
scanf("%d",&id);
if(i!=0)
printf(" ");
printf("%d",n-sum( position[id] ) );
update(position[id],-1);
position[id]=++top;
}
printf("\n");
} }

最新文章

  1. [LeetCode] Palindrome Partitioning 拆分回文串
  2. AsyncTask的初步了解
  3. linux shell mysql 数据库主从同步状态检查告警
  4. vb6 实现奇门遁甲起局排盘、格局分析概要
  5. Step deep into GLSL
  6. Photoshop支持ico输出
  7. 一起啃PRML - 1 Introduction 绪论
  8. mysql innodb myisam 主要区别与更改方法
  9. huffman压缩解压文件【代码】
  10. PHP站内搜索
  11. C++语言中的类型(一)
  12. cocos2dx3.2移植android
  13. K8s 入门
  14. 理解mysql执行多表联合查询
  15. VBS下载者助以一臂之力
  16. Java之ConcurrentHashMap
  17. 1.ossutil初步使用
  18. python _、__、__xx__之间的差别
  19. java反射机制的理解
  20. 判断IE浏览器的版本号

热门文章

  1. git 版本管理工具说明
  2. 最短路 spfa, dijkstra, Floyd
  3. Jquery Validator 增加自定义验证方法
  4. PatentTips - Control register access virtualization performance improvement
  5. AutoCAD 许可管理器不起作用,或未正确安装,现在将关闭
  6. Effective C++ 条款43
  7. 小白学开发(iOS)OC_ block数据类型(2015-08-08)
  8. python 时间合集 一
  9. Git安装及密钥的生成并上传本地文件到GitHub上
  10. sql server向表里添加字段