点我看题

初步想法是模拟,找到下一个位置并记录操作数,O(n^2)肯定会超时。

那么进行优化,会发现到下一位置的操作数就是两个位置之间存在的数的个数,于是就变成了计数问题。

不难想到用树状数组或线段树进行计数,时间复杂度O(nlogn)。

 #include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<string.h>
using namespace std;
const int Nmax=;
int n,now;
long long ans;
int num[Nmax],pos[Nmax];
int c[Nmax]; int lowbit(int x)
{
return x&(-x);
} int get_sum(int x)
{
int ans=;
while(x)
ans+=c[x],x-=lowbit(x);
return ans;
} int query(int l,int r)
{
return get_sum(r)-get_sum(l-);
} void update(int p,int add)
{
while(p<=n)
c[p]+=add,p+=lowbit(p);
} void build()
{
for(int i=;i<=n;i++)
c[i]=;
for(int i=;i<=n;i++)
update(i,);
} int main()
{
freopen("in.in","r",stdin);
while(scanf("%d",&n) && n!=)
{
for(int i=;i<=n;i++)
{
scanf("%d",&num[i]);
pos[num[i]]=i;
}
build();
now=,ans=;
for(int i=;i<=n;i++)
{
if(pos[i]>now)
ans+=min(query(now,pos[i]),query(,now)+query(pos[i],n)); else if(pos[i]<now)
ans+=min(query(pos[i],now),query(now,n)+query(,pos[i]));
else
ans++; now=pos[i],update(pos[i],-),num[pos[i]]=;
if(i==n)
break;
while(!num[now])
now=now%n+;
}
printf("%lld\n",ans); }
return ;
}

HDU 4262 Juggler的更多相关文章

  1. HDU 4262 Juggler 树状数组

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

  2. hdu 4262(线段树)

    题目:有一个圈,可以从某个位置取球,给出原有的顺序,有三种操作,左旋一次,右旋一次,取球,要求按顺序取球,问需要操作多少次 显然操作是确定的,每次将目标球旋转过来,找出左旋和右旋操作少的,然后取球. ...

  3. BNUOJ 26228 Juggler

    Juggler Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 42 ...

  4. HDU 4426 Palindromic Substring

    Palindromic Substring Time Limit: 10000ms Memory Limit: 65536KB This problem will be judged on HDU. ...

  5. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  7. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  8. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  9. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

随机推荐

  1. MSSQL Rebuild(重建)索引

    MSSQL Rebuild(重建)索引 前的项目是做数据库的归档,在每次archive后都需要对原数据库的索引进行rebuild,以减少索引碎片,于是乎就自己写了一段sql: DECLARE @tab ...

  2. Web缓存解决方案

    缓存是构建于HTTP统一接口之上的最有用功能之一.可以利用缓存减少终端用户感知到的延时,增加可靠性,减少带宽使用和成本,降低服务器负载.缓存无处不在,可以在服务器网络里,内容分发网络(Content ...

  3. TOGAF架构开发方法(ADM)之架构变更管理阶段

    TOGAF架构开发方法(ADM)之架构变更管理阶段 1.10 架构变更管理(Architecture Change Management) 企业架构开发方法各阶段——架构变更管理 1.10.1 目标 ...

  4. sharepoint 2013 文档库eventhandle权限控制

    记录一下如何在sharepoint server 2013文档库中,使用eventhandle控制文档库document library的条目item权限. ///<summary> // ...

  5. Windows下安装Redmine-2.5.3

    安装准备 服务器操作系统:Windows Server 2008 R2 Standard,64位操作系统. RailsInstaller版本:2.2.4  (下载地址http://railsinsta ...

  6. 【转】关于python中re模块split方法的使用

    注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...

  7. Asio C++ Library,libuv - Cross-platform asynchronous I/O

    http://think-async.com/ http://libuv.org/ https://github.com/libuv/libuv

  8. Threejs基础学习【修改版】

    一. Three.js官网及使用Three.js必备的三个条件 1.Three.js 官网 https://threejs.org/ 2.使用Three.js必备的三个条件(To actually b ...

  9. Redmine数据库备份及搬家

    Bitnami Redmine的备份分2种方式: 1.导出数据库 2.整个目录搬家 不管是哪种都想停掉服务,redmine相关的服务有以下5个: redmineApache redmineMySQL ...

  10. AutoLayout 之NSLayoutConstraint

    这次主要讲的用代码来设置AutoLayout,为实现添加autoLayout视图主要介绍使用如下该方法,调用方法:- (void)awakeFromNib {} +(instancetype)cons ...