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

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

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

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

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

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

转载于:https://www.cnblogs.com/GBRgbr/p/3297745.html

HDU 4262 Juggler 树状数组相关推荐

  1. TOJ 4354 HDU 4262 Juggler / 树状数组

    Juggler 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte   描述 As part of my magical juggling act, I ...

  2. HDU 6681(树状数组统计平面内射线的交点个数)

    HDU 6681(树状数组,统计平面内射线的交点个数) 题目链接:传送门 题意:给出k条射线,求射线将n∗mn*mn∗m 的区域分成几个联通块.每两条射线的端点x坐标和y坐标都互不相同. 思路:根据 ...

  3. hdu 5497 Inversion(树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5497 解题思路: 用树状数组维护一段区间L,区间长度为m,依次枚举该区间的终点ai,即将该点加入到区间 ...

  4. C - Group HDU - 4638[离线+树状数组]

    感觉比较抽象:举个例子:a[] = {3 1 2 5 4} 树状数组里面:1,1,-1,1,-1 sum(2):就是[1,2]区间能分成多少个连续的段:1和3 sum(3):1 2 3是一段 如果是询 ...

  5. HDU 4638 Group 树状数组 + 思路

    实际上就是问这个区间编号连续的段的个数,假如一个编号连续的段有(a+b)个人,我把他们分在同一组能得到的分值为(a+b)^2,而把他们分成人数为a和b的两组的话,得到的分值就是a^2+b^2,显然(a ...

  6. hdu 5542(树状数组优化dp)

    题意: 求n个数中长度为m的上升子序列的个数 解题思路:dp[i][j]表示第i个数长度为j的上升序列的个数.dp[i][j] = sum{dp[k][j-1] | a[k] < a[i]},这 ...

  7. HDU 4325 离散化+树状数组 或者 不使用树状数组

    题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...

  8. Billboard HDU - 2795(树状数组,单点修改,区间查询)

    题目链接:https://vjudge.net/problem/HDU-2795 思路:h = 1e9行不通,因为广告是1*w的,所以n个广告最多只需要 h = n的高度,那么h=2e5就可以接受了. ...

  9. HDU 3584 三维树状数组

    三维树状数组模版.优化不动了. #include <set> #include <map> #include <stack> #include <cmath& ...

最新文章

  1. Windows和linux双系统——改动默认启动顺序
  2. 联想平板电脑win10如何取消触摸键盘按键声音
  3. activemq无账户密码登录配置修改
  4. c++新特性11 (11)unique_ptr
  5. Python3算法基础练习:编程100例( 21~ 25)
  6. OpenCV使用基本算法检测颜色检查器
  7. luogu P1880 [NOI1995]石子合并
  8. 普通IO流字符输入输出流文件拷贝
  9. JavaScript学习总结(5)——Javascript面向(基于)对象编程
  10. 在Windows 7 专业版 SP1安装多语言包的办法 摘录
  11. js基础(2)~元素增删,属性,节点,定时器,date,事件,模块
  12. 谷歌地球 最新hosts_给我一个Google地球app,可以领略全球3D风情
  13. echarts柱状堆积图
  14. html中电脑自动输入,电脑一直自动打字怎么办
  15. w ndows7错误恢复,windows7错误恢复进不去,windos错误恢复打不开
  16. 如何使用K8S实现自动化部署
  17. python基础螺旋线
  18. java 导出本地xml文件_java导出xml文件
  19. 宏基因组分箱CheckM评估结果的提取
  20. 不算不知道,花呗分期的真实利率居然这么高

热门文章

  1. 谭宏川老师(Samuel Tan)专业化销售技术提升专家
  2. python分割字符串为字母_关于python:以大写字母分割字符串
  3. final finally finalize三者有什么区别
  4. 致远项目管理SPM系统之变更管理概述
  5. 应届毕业生面试自我介绍范文(希望对今年新找工作的同学有用!)
  6. 王力宏 有兴趣就看看
  7. Google Play 签名不一致的解决方案
  8. 第一章 Hadoop
  9. 计算机点击应用时总是跳到顶端,电脑开始菜单跑到上面了怎么办 电脑开始菜单错位解决方法【图文】...
  10. 下载opencv3.4.2.16