转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove

http://acm.hdu.edu.cn/showproblem.php?pid=4262

题目:有一个圈,可以从某个位置取球,给出原有的顺序,有三种操作,左旋一次,右旋一次,取球,要求按顺序取球,问需要操作多少次

显然操作是确定的,每次将目标球旋转过来,找出左旋和右旋操作少的,然后取球。

比较麻烦的是,每次有的球取走了,不知道左旋和右旋需要多少次操作,开始直接STL查找,由于是无序的,O(N)的查找必然超时。

后来想到线段树优化一下查询过程。

每次记录某个区间删掉了多少,就可以查询了。

注意细节处理

pos记录当前的位置

#include <cstdio>
#include <cstring>
#include <iostream>
#include<vector>
#include<algorithm>
#define N 100005
#define pb(a) push_back(a)
#define LL long long
#define lson step<<1
#define rson step<<1|1
using namespace std;
struct Node{int left,right,mid;int num;
}L[N*5];
void Bulid(int step,int l,int r){L[step].left=l;L[step].right=r;L[step].mid=(l+r)/2;L[step].num=0;if(l==r) return;Bulid(lson,l,L[step].mid);Bulid(rson,L[step].mid+1,r);
}
void update(int step,int pos){L[step].num++;if(L[step].left==L[step].right) return;if(pos<=L[step].mid) update(lson,pos);else update(rson,pos);
}
int query(int step,int l,int r){if(L[step].left==l&&L[step].right==r) return L[step].num;if(r<=L[step].mid) return query(lson,l,r);else if(l>L[step].mid) return query(rson,l,r);else return query(lson,l,L[step].mid)+query(rson,L[step].mid+1,r);
}
int a[N],b[N];
int main(){int n,k;while(scanf("%d",&n)!=EOF&&n){int pos=1;Bulid(1,1,n);for(int i=1;i<=n;i++) {scanf("%d",&a[i]);b[a[i]]=i;}LL ans=n;if(b[1]!=1) ans+=min(b[1]-1,n-b[1]+1);pos=b[1];update(1,b[1]);for(int i=2;i<=n;i++){int c,d;if(pos<b[i]) {d=query(1,pos+1,b[i]);c=b[i]-pos-d-1;}else {d=query(1,b[i],pos-1);c=pos-b[i]-d;}ans+=min(c,n-i+1-c);pos=b[i];update(1,b[i]);}printf("%I64d\n",ans);}return 0;
}

HDU 4262 Juggler (模拟+线段树优化)相关推荐

  1. hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )

    http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意: 刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问 m次  输入 a,l,r,z 如果 ...

  2. hdu 4521(线段树优化dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Pro ...

  3. CF786B Legacy(线段树优化建边模板 + 最短路)

    整理的算法模板合集: ACM模板 目录 线段树优化建边 题目传送门 由于本题的数据达到了1e5,所以如果直接全部暴力连边的话会达到O(n2)O(n^2)O(n2),时间包括内存都受不了.因此我们需要使 ...

  4. P1047 校门外的树(线段树优化)(校门三部曲)难度⭐⭐

    校门三部曲,总算完结了!完结散花! 难度呈阶梯状,都可以用线段树解决. 第一部 P1047 校门外的树(线段树优化)难度⭐⭐ 第二部 P1276 校门外的树(增强版)(线段树)校门三部曲难度⭐⭐⭐ 第 ...

  5. string [线段树优化桶排]

    题意大概是给你一个字符串,1e5次修改,每次给一个区间升序排列或降序排列,最后输出这个字符串; 其实是个挺裸的线段树优化题;但是我没有意识去结合桶排,扑该..... 首先 1.40分算法 O(NMlo ...

  6. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

  7. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

  8. hdu5489 Removed Interval dp+线段树优化

    现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...

  9. 【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

    题意:有nnn个武器和mmm个飞船,武器有下面三种 从给定的集合SSS中击破一个. 在给定的区间[L,R][L,R][L,R]中击破一个. 对于给定的a,b,ca,b,ca,b,c,选择000个或22 ...

最新文章

  1. 写python的c扩展简介
  2. tortoisesvn创建部署项目_FrameWork如何进行云托管部署
  3. OpenGL 视图和颜色的概念
  4. jenkins修改pom文件_DevOps实践:Jenkins与Nexus制品库集成
  5. 1342.将数字变成0的操作次数
  6. (附源码)php小型网络舆情平台设计的开发毕业设计252324
  7. vue css下载字体并引入使用
  8. linux编译安装openssl-3.0.2
  9. python自回归模型_21向量自回归模型
  10. 时间序列分析 23 DTW (时序相似度度量算法) 上
  11. arm模拟器手机版_在 Android 模拟器上运行 ARM 应用
  12. 内网通过映射后的公网IP访问内网服务测试--ASA842 hairpin NAT测试
  13. 立创EDA网页标准版元件多太卡解决方法
  14. 从360遇上苹果说起
  15. 计算机游戏本和商务本的区别,商务本和游戏本有什么区别
  16. python办公自动化模块_Python自动化办公Excel模块openpyxl原理及用法解析
  17. android Wifi自动连接
  18. 关于GPS 坐标系的那些事
  19. ORB_SLAM2源码阅读(三)相机定位
  20. android中的长按复制

热门文章

  1. Java synchronized偏向锁、轻量级锁、重量级锁
  2. python try/except与try/finally使用
  3. 【论文阅读】三.基于智能网联车的信号交叉口更易受到拥堵型攻击
  4. 计算机9针485接口,RS485是九针的插口,而实际上里面只能两根线是有用的,其它的七根线则无作用,那为什么弄九针呢?-工业支持中心-西门子中国...
  5. Android融云会话及会话列表的实现
  6. 神经网络(二):Softmax函数与多元逻辑回归
  7. Linux系统之DNS解析
  8. bigquery_Google的BigQuery提供免费访问GDELT的权限
  9. 求1到100之间的质数(素数)?
  10. LYL程序员小白的理解之简单易懂的Arduino的串口通讯