将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系。

记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编号与当前手里球的编号之间有几个球。

树状数组C[i]记录编号i的球是否还在。

球是环形排列的,特殊处理一下。

对于扔掉一个球之后下一个落在手里的球的编号,二分判定,找顺时针方向第一个有球的位置

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define LL long long int using namespace std; const int MAXN = ; int C[MAXN];
int N;
int PosToID[MAXN];
int IDToPos[MAXN]; int lowbit( int x )
{
return x & ( -x );
} int query( int x )
{
if ( !x ) return ;
int res = ;
while ( x > )
{
res += C[x];
x -= lowbit(x);
}
return res;
} void update( int x, int val )
{
while ( x <= N )
{
C[x] += val;
x += lowbit(x);
}
return;
} int BiSearch( int l, int r )
{
int pre = l;
if ( query(r) - query(l) == )
{
r = l;
l = ;
pre = ;
} int ans = ;
while ( l <= r )
{
int mid = ( l + r ) >> ;
if ( query(mid) - query(pre) > )
{
ans = mid;
r = mid - ;
}
else l = mid + ;
}
return ans;
} int main()
{
while ( scanf( "%d", &N ), N )
{
memset( C, , sizeof(C) );
for ( int i = ; i <= N; ++i )
{
scanf("%d", &IDToPos[i] );
PosToID[ IDToPos[i] ] = i;
update( i, );
} int cur = ; //当前手里的
LL ans = ;
for ( int i = ; i <= N; ++i )
{
int id = PosToID[i]; if ( id < cur )
{
int tmp = query(cur) - query(id);
ans += min( tmp, query(N) - query(cur) + query(id) );
}
else if ( id > cur )
{
int tmp = query(id) - query(cur);
ans += min( tmp, query(N) - query(id) + query(cur) );
}
update( id, - );
++ans;
cur = BiSearch( id, N );
}
printf( "%I64d\n", ans );
}
return ;
}

HDU 4262 Juggler 树状数组的更多相关文章

  1. HDU 2838 (DP+树状数组维护带权排序)

    Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...

  2. HDU 2689Sort it 树状数组 逆序对

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. hdu 4046 Panda 树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4046 When I wrote down this letter, you may have been ...

  4. hdu 5497 Inversion 树状数组 逆序对,单点修改

    Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...

  5. HDU 5493 Queue 树状数组

    Queue Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5493 Des ...

  6. POJ 2352 &amp;&amp; HDU 1541 Stars (树状数组)

    一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...

  7. hdu 1541 (基本树状数组) Stars

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1541 n个星星的坐标,问在某个点左边(横坐标和纵坐标不大于该点)的点的个数有多少个,输出n行,每行有一个数字 ...

  8. hdu 4031(树状数组+辅助数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Attack Time Limit: 5000/3000 MS (Java/Others)    ...

  9. HDU 4325 Flowers 树状数组+离散化

    Flowers Problem Description As is known to all, the blooming time and duration varies between differ ...

随机推荐

  1. 剑指offer 35 第一个只出现一次的字符

    错误写法 class Solution { public: int FirstNotRepeatingChar(string str) { int length = str.size(); ) ; ] ...

  2. 【洛谷P1314】[NOIP2011]聪明的质监员

    聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...

  3. maven中import scope依赖方式解决单继承问题的理解

    在maven多模块项目中,为了保持模块间依赖的统一,常规做法是在parent model中,使用dependencyManagement预定义所有模块需要用到的dependency(依赖) <d ...

  4. 5、SpringBoot+Mybatis整合------多对多

    开发工具:STS 代码下载链接:https://github.com/theIndoorTrain/SpringBoot_Mybatis/tree/3baea10a3a1104bda815c20695 ...

  5. 浅谈MySQL字符集

      Preface       MySQL use character set & collation to organize the different charater.It provid ...

  6. mysql基础 反范式化

  7. JS之执行上下文

    执行上下文(execution context),是JS中的一个很重要的概念.它对于我们理解函数定义,执行时都做了什么有着很大的意义.理解它我们才能明白我们常说的函数声明提升,作用域链,闭包等原理. ...

  8. php中==和===的含义及区别

    ===比较两个变量的值和类型:==比较两个变量的值,不比较数据类型. 比如 $a = '123'; $b = 123; $a === $b为假: $a == $b为真: 有些情况下不能使用==,可以使 ...

  9. 22.1 高级函数【JavaScript高级程序设计第三版】

    函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...

  10. php扩展开发-INI配置

    php.ini文件是用来保存各项扩展配置的文件,每个扩展都或多或少需要有一个定制化的配置,ini文件是一个很好的保存配置的方式,我们来看下怎么在自己的扩展里,使用到ini的配置功能 //创建ini的配 ...