题意:某人手上有一串珠子,顺时针编号1--n,每次可进行三种操作:顺时针旋转一个珠子,逆时针旋转一个珠子,将手中的珠子移去(移去后顺时针方向下一个珠子进入手中),问按标号12345顺序将所有珠子逐一移去,最少需要多少次操作。

分析:假设当前要移除的珠子为x,x左边的珠子用A代表,右边的珠子用B代表即AxB,则无论左移还是右移都会得到xBA,即移去某个珠子对后面的珠子无影响,每次只需单独考虑A和B的长度,取最小累加即可。

做法:比赛时想复杂了,想维护每个珠子position的变化,一度想用伸展树旋转,没有充分利用循环性。自己找张小纸条转一下就很容易发现规律了(吾,有时过于感性了)

因为序列是循环的,因此每次旋转改变绝对位置不改变相对位置,因此记录当前手中珠子的初始位置cnt,若下个珠子的原始位置为pos,若cnt=pos则不需要转,若cnt<pos,设x为cnt与pos之间的珠子数,n为当前剩余的珠子,则旋转需要min(x,n-x)次cnt>pos时情况类似。用树状数组统计,每次一出后对应位置-1即可。

注意:下一次的位置不需要从当前位置开始顺时针找第一个存在的珠子,只需停在当前位置就好,因为当前位是0,不影响下一次树状数组的统计。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include<cmath>
using namespace std;int ss[100010],n;inline int lowbit(int k){return (k&-k);}void inc(int i,int k){while(i<=n){ss[i]+=k;i+=lowbit(i);}}int get(int i){int sum=0;while(i>0){sum+=ss[i];i-=lowbit(i);}return sum;}int pos[100010],p;int  main(){while(scanf("%d",&n)&&n!=0){for(int i=1;i<=n;i++){scanf("%d",&p);pos[p]=i;ss[i]=lowbit(i);}int cnt=1,x;long long ans=0;for(int i=1;i<=n;i++){ans++;if(cnt!=pos[i]){x=abs(get(cnt-1)-get(pos[i]-1));ans+=min(x,n-i+1-x);}cnt=pos[i];inc(pos[i],-1);}printf("%I64d\n",ans);}}

跑的很快,看来是正解!

hdu 4262 Juggler(树状数组)相关推荐

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

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

  2. HDU 4262 Juggler 树状数组

    将每个球按输入顺序编号,建立 它第几个被扔掉->编号 的映射关系. 记录当前在手里的球的编号,按扔掉的顺序查找这个球的编号,看看这个球是逆时针转到手里更近还是顺时针转到手里更近,即当前扔掉球的编 ...

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

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

  4. hdu 5497 Inversion(树状数组)

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

  5. 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是一段 如果是询 ...

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

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

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

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

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

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

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

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

  10. HDU 3584 三维树状数组

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

最新文章

  1. 「长图」使用AI前需要评估的
  2. SpringCloud学习之路(一)-简单Demo
  3. NAR再版 | 人类长非编码RNA知识库LncRNAWiki 2.0
  4. PHP物业居民小区业主房产办公管理系统源码-支持多小区管理系统
  5. 网页转PDF 在线工具 输入网址获取PDF
  6. Nero Burning Rom V6多区段刻录详解
  7. 元素(Element)
  8. php多用户记账系统,PHP多用户记账程序V2.3发布
  9. JanusGraph的使用
  10. python模拟登录163邮箱_用python实现模拟登陆163邮箱
  11. 详解黑客的攻击方式1---网络欺骗攻击
  12. html word 批注,word怎么批注修改文章
  13. Cluster analysis :Basic Concepts and Algorithms -- Part 5 Cluster Evalation
  14. Debian虚拟机安装常用软件
  15. 【android】SSL peer shut down incorrectly
  16. 计算机语言学翁富良,形式语言与自动机的关系.doc
  17. 【Azure DevOps系列】什么是Azure DevOps
  18. (转)中国外包企业战略思考
  19. JS 将指定内容复制到剪贴板
  20. linux充值系统下载,几款Linux操作系统下载

热门文章

  1. [机缘参悟-65]:《兵者,诡道也》-6-三十六计解读-并战计
  2. 如何从iCloud中下载元气骑士存档
  3. 数采物联仪表照片抓拍AI图像识别软件使用说明
  4. 【洛谷题解】P2356 弹珠游戏
  5. JS 运行机制最全面的一次梳理
  6. srping boog 启动 but has failed to stop it. This is very likely to create a memory leak. Stack trac...
  7. 【包管理器】vcpkg
  8. RDO LOST / loss rdo
  9. 建议阿里巴巴10亿回购股票救市
  10. C++][基础知识 5] 虚函数