题意:有一个长度为n的序列,你每次可以选择两个相邻的元素交换,求把这个序列排成单峰序列的最少交换次数。

方法一:将元素按数值从大到小排序(保存原来的位置),把最大的插在中间,剩下的依次往两边放,依次考虑每个数该放在左边还是右边,只考虑后加入的数对已有的数的贡献。由于前面加入的数的次序对后加入的数无影响,因此贪心地选择贡献小的一边就行了。贡献为重排后下标的逆序数,注意大小相同的要特殊处理一下就行了。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
struct D {
int x,y;
bool operator<(const D& b)const {return x>b.x;}
} a[N];
int c[N],n;
int lb(int x) {return x&-x;}
void add(int u,int x) {for(; u<N; u+=lb(u))c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=lb(u))ret+=c[u]; return ret;}
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i)scanf("%d",&a[i].x),a[i].y=i+;
sort(a,a+n);
ll ans=;
for(int i=,j,k; i<n; i=j) {
for(j=i; j<n&&a[j].x==a[i].x; ++j);
for(k=i; k<j; ++k) {
int t=get(a[k].y);
ans+=min(t,i-t);
}
for(k=i; k<j; ++k)add(a[k].y,);
}
printf("%lld\n",ans);
return ;
}

方法二:通过观察可以发现:

1.把一个元素通过相邻交换的方式移动到其他地方,其他元素的相对位置不变

2.对于单峰序列,比某个元素大的数必定都在该元素的同侧

因此,对于每个元素而言,要么把它左边比它大的元素都移到右边去,要么把它右边比它大的元素都移到左边来,因此每个元素对答案的贡献为min(左边比它大的元素数,右边比它大的元素数),树状数组左右各扫一遍就行了。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
int L[N],R[N],c[N],n,a[N];
int lb(int x) {return x&-x;}
void add(int u,int x) {for(; u<N; u+=lb(u))c[u]+=x;}
int get(int u) {int ret=; for(; u; u-=lb(u))ret+=c[u]; return ret;}
int main() {
scanf("%d",&n);
for(int i=; i<n; ++i)scanf("%d",&a[i]);
for(int i=; i<n; ++i)L[i]=i-get(a[i]),add(a[i],);
memset(c,,sizeof c);
for(int i=n-; i>=; --i)R[i]=n--i-get(a[i]),add(a[i],);
ll ans=;
for(int i=; i<n; ++i)ans+=min(L[i],R[i]);
printf("%lld\n",ans);
return ;
}

Gym - 102082G What Goes Up Must Come Down (树状数组+贪心)的更多相关文章

  1. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

  2. Gym 101908C - Pizza Cutter - [树状数组]

    题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...

  3. Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp

    Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...

  4. gym 102082G BZOJ4240 贪心+树状数组

    4240: 有趣的家庭菜园 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 756  Solved: 349[Submit][Status][Discu ...

  5. Gym 100463A Crossings (树状数组 逆序对)

    Crossings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100463 Description ...

  6. Gym 100960G (set+树状数组)

    Problem Youngling Tournament 题目大意 给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]. n<=10^ ...

  7. Gym - 101350F Monkeying Around(线段树+树状数组)

    When the monkey professor leaves his class for a short time, all the monkeys go bananas. N monkeys a ...

  8. Gym - 101755G Underpalindromity (树状数组)

    Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...

  9. Gym - 100269F Flight Boarding Optimization(dp+树状数组)

    原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...

随机推荐

  1. Python爬虫学习==>第九章:正则表达式基础

    学习目的: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特点字符.及这些特点字符组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 正式步骤 Step1 ...

  2. java安全停止线程

    Thread.stop()是一个被废弃的方法,不被推荐使用的原因是stop方法太过于暴力,强行把执行到一半的线程终止,并且会立即释放这个线程所有的锁.会破坏了线程中引用对象的一致性. 使用判断标志位的 ...

  3. URL库函数

    1.urlopen from urllib import request resp=request urlopen('http://www.baidu.com') print(resp.read()) ...

  4. pickle.dump()和pickle.load()

    python的pickle模块实现了基本的数据序列和反序列化. 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储: 通过pickle模块的反序列化操作,我们能够从 ...

  5. Java架构师 -- 知识库

    1,CSDN知识库: http://lib.csdn.net/base/architecture 2,淘宝

  6. ADG环境搭建

    一:实验环境介绍PC机系统: CentOS 6.5(64位)数据库版本: Oracle 11gR2 11.2.0.4 (64位)IP地址规划:主数据库10.110.9.41 SID:orapridb_ ...

  7. CF235A 【LCM Challenge】

    这题好毒瘤啊 (特别是long long的坑,调了半天没调好!!)先将你特判一下小于3的话直接输出就是惹,不是的话就判断一下它能不能被2整除如果不能就直接输出n*(n-1)*(n-2)否则进行枚举枚举 ...

  8. Java 条件语句 if else

    一个 if 语句包含一个布尔表达式和一条或多条语句. 语法 if 语句的语法如下: if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 如果布尔表达式的值为 true,则执行 if ...

  9. python:enumerate 函数

    说明 enumerate()是python的内置函数: 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 多用于 ...

  10. 12 Python之函数进阶

    1. 动态传参 *, ** : 形参: 聚合 位置参数* -> 元组 def func(*args, a, b, c): print(a, b , c, args) func(1,2,3,4,5 ...