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

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

每次旋转后相对距离不变,每次记录某个区间删掉了多少,就可以查询了。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
#define lson l, m, rt<<1
#define rson m + 1, r, rt<<1|1
typedef long long ll;
const int maxn = 1e5 + ;
int n, pos[maxn], sum[maxn << ];
ll ans;
void update(int p, int l, int r, int rt){
sum[rt]++;
if (l == r) return;
int m = (l + r) >> ;
if (p <= m) update(p, lson);
else update(p, rson);
}
int query(int L, int R, int l, int r, int rt){
if (L > R) return ;
if (L <= l && R >= r){
return sum[rt];
}
int m = (l + r) >> ;
int ret = ;
if (L <= m) ret += query(L, R, lson);
if (R > m) ret += query(L, R, rson);
return ret;
}
int main(){
int x;
while (~scanf("%d", &n) && n){
ans = ;
memset(sum, , sizeof(sum));
for (int i = ; i < n; ++i){
scanf("%d", &x);
pos[x] = i + ;
}
int pre = , q, c, lx, rx;
for (int i = ; i <= n; ++i){
x = pos[i];
if (x > pre){
q = query(pre + , x, , n, );
lx = x - pre - - q;
rx = n - i + - lx;
}
else{
q = query(x + , pre - , , n, );
rx = pre - x - q;
lx = n - i + - rx;
}
//cout << " lx = " << lx << " rx = " << rx << endl;
//int lx = x - 1 - query(1, x - 1, 1, n, 1);
//int rx = n - x + 1 - query(x + 1, n, 1, n, 1);
ans += min(lx, rx) + ;
pre = x;
update(x, , n, );
}
printf("%lld\n", ans);
}
return ;
}

hdu 4262(线段树)的更多相关文章

  1. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  4. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  5. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  6. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  7. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. Oracle Database 11.2.0.4.0 已在 中标麒麟Linux x86-64 NeoKylin Linux Advanced Server 6 上通过认证

    啥都不说了,上截图:

  2. Unity3D教程宝典之Web服务器篇:(第一讲)服务器的架设

    转载自风宇冲Unity3D教程学院 引言:本文主要介绍WAMP服务器的架设. 第一部分WAMP介绍;第二部分WAMP安装及使用.                        第一部分WAMP介绍 什 ...

  3. html的小例子

    常用的前端实例: 1略 2.在网页商城中的图片当我们把鼠标放上去之后,图片会显示一个有颜色的外边框,图片某一部分的字体的颜色并发生改变 鼠标放上去之前 鼠标放上去之后: 实现的代码: <!DOC ...

  4. Joomla详细安装图文教程

    Joomla 详细安装图文教程 第一步,配置网站信息 配置数据库:这里我选择MySQLi,可以根据自己的选择         安装-- 安装完成!

  5. oracle 创建一个用户,并且设定只能访问指定的对象

    出处:http://www.cnblogs.com/BetterWF/archive/2012/07/03/2574416.html 今天在开发接口时候,需要给接口开发公司提供一个ORACLE 用户, ...

  6. MongoDB笔记(二):MongoDB下Shell的基本操作

    一.mongoDB与关系型数据库对比 对比项              mongoDB             关系型数据库(oracle.mysql) 表 集合List 二维表table 表的一行数 ...

  7. Hibernate单向“多对一”关联

    1. 基于外键关联的单向“多对一”关联是最常见的单向关联其中指定many-to-one的unique="true",为单向“一对一”,不指定就是单向“多对一” <class  ...

  8. HTML输入验证提示信息

    1.oninvali事件通过setCustomValidity方法来自定义提示信息 <form action=""> <label> 数字: <inp ...

  9. 工作总结 "2017年8月11日" 转换为datatime

    string strr = "2017年8月11日"; Console.WriteLine((Convert.ToDateTime(strr)).ToString("yy ...

  10. 用Jmeter测试RabbitMQ

    1.下载AMQP插件 github上面有源码,可以通过ant+ivy在本地进行打包(下载IDEA实践成功) https://github.com/jlavallee/JMeter-Rabbit-AMQ ...