点我看题

初步想法是模拟,找到下一个位置并记录操作数,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. Centos6.3不能使用yum install安装gcc编辑器解决办法

    mv /var/lib/rpm/__db* /tmp rpm --rebuilddb yum clean all

  2. linux 消息队列例子

    /author:DriverMonkey //phone:13410905075 //mail:bookworepeng@Hotmail.com //qq:196568501 #include < ...

  3. JS的运算问题……

    在公司实习期间,发现了一个JS很奇怪的问题. 今天在这里来探讨一下 第一个问题 在生活中或者其他语言中一般相加是这样的:0.1+0.2=0.3; 但在JS中却是这样:0.1+0.2=0.3000000 ...

  4. Dubbo源码学习--注册中心分析

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...

  5. [ios2]ios RSA

    http://blog.iamzsx.me/show.html?id=155002 http://www.theosoft.net/ http://blog.sina.com.cn/s/blog_5f ...

  6. web页面在微信里打开,字体颜色不正常显示

    问题:写的web项目在微信里的webview里打开(iphone手机),会出现颜色的不识别.写的是白色,数字的部分会过了3-5秒后,变成黑色! 原因:在iphone手机里,数字的部分(具体的长度没有测 ...

  7. FragmentPagerAdapter和FragmentStatePagerAdapter区别?

    FragmentPagerAdapter:对于不再需要的fragment,选择调用detach方法,仅销毁视图,并不会销毁fragment实例.FragmentStatePagerAdapter:会销 ...

  8. 使用vim配置方案spf13中碰到的一些问题

    目的:达到我自己自定义安装插件的目的 安装YCM(YouCompleteMe)自动补全神器之前的准备 先安装编译环境: 1 2 sudo apt-get install build-essential ...

  9. SwiftyUserDefaults-封装系统本地化的框架

    // // ViewController.swift // Test4SwiftyUserDefaults // // Created by 马玉龙 on 2017/1/14. // Copyrigh ...

  10. asp.net如何把一个tostring类型转化为dateTime类型

    Convert.ToDateTime(dr["consult_DealTime"].ToString()).ToString("yyyy-MM-dd"); co ...