【BZOJ4240】有趣的家庭菜园

Description

对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物。JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N。IOI草一共有N株,每个区域种植着一株。在第i个区域种植的IOI草,在春天的时候高度会生长至hi,此后便不再生长。
为了观察春天的样子而出行的JOI君注意到了IOI草的配置与预定的不太一样。IOI草是一种非常依靠阳光的植物,如果某个区域的IOI草的东侧和西侧都有比它高的IOI草存在,那么这株IOI草就会在夏天之前枯萎。换句话说,为了不让任何一株IOI草枯萎,需要满足以下条件:
对于任意2<=i<=N-1,以下两个条件至少满足一个:
1. 对于任意1<=j<=i-1,hj<=hi
2. 对于任意i+1<=j<=N,hk<=hi
IOI草是非常昂贵的,为了不让IOI草枯萎,JOI君需要调换IOI草的顺序。IOI草非常非常的高大且纤细的植物,因此JOI君每次只能交换相邻两株IOI草。也就是说,JOI君每次需要选择一个整数i(1<=i<=N-1),然后交换第i株IOI草和第i+1株IOI草。随着夏天临近,IOI草枯萎的可能性越来越大,因此JOI君想知道让所有IOI草都不会枯萎的最少操作次数。
现在给出田地的区域数,以及每株IOI草的高度,请你求出让所有IOI草的不会枯萎的最少操作次数。

Input

第一行一个正整数N,代表田地被分为了N个区域。
接下来N行,第i行(1<=i<=N)一个整数hi,表示第i株植物在春天时的高度

Output

输出一行一个整数,表示最少需要的操作次数

Sample Input

6
2
8
4
5
3
6

Sample Output

3

HINT

最终的高度序列为2 4 5 8 6 3,共需要操作三次。
3<=N<=3*10^5
1<=hi<=10^9

题解:一个经常用到的结论:我们给原数组标上下表1...n,移动若干次后我们会得到一个新的下标序列,需要的搬运次数就是这个新序列的逆序对数。

所以我们思考怎样让新序列的逆序对数更少就行了。题中要求最终序列满足h值先递增再递减,所以最大的一定放到中间,次大的可以放在最大的两边,再次的放在前两大的两边。。。所以,当放入第k大的时候,我们贪心选择可以形成较少的逆序对的那边放,并且这样做不会影响到后面的节点。

还有如果多个草高度相同要特判一下。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=300010;
typedef long long ll;
ll ans;
int n,l,r;
int s[maxn],v[maxn],p[maxn];
void updata(int x,int val)
{
for(int i=x;i<=n;i+=i&-i) s[i]+=val;
}
int query(int x)
{
int i,ret=0;
for(i=x;i;i-=i&-i) ret+=s[i];
return ret;
}
bool cmp(int a,int b)
{
return v[a]>v[b];
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
scanf("%d",&n);
int i,j,a;
for(i=1;i<=n;i++) v[i]=rd(),p[i]=i;
sort(p+1,p+n+1,cmp);
for(i=1;i<=n;)
{
for(j=i;j<=n;j++)
{
a=query(p[j]),ans+=min(a,i-1-a);
if(v[p[j+1]]!=v[p[j]]) break;
}
for(;i<=j;i++) updata(p[i],1);
}
printf("%lld",ans);
return 0;
}

【BZOJ4240】有趣的家庭菜园 树状数组+贪心的更多相关文章

  1. bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)

    4240: 有趣的家庭菜园 题目:传送门 题解: 好题!%%% 一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列? 然后开始一顿瞎搞...一WA 看一波路牌...树状数组 ...

  2. bzoj 4240: 有趣的家庭菜园 树状数组+贪心

    有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素, ...

  3. 【bzoj4240】 有趣的家庭菜园 树状数组

    这一题最终要构造的序列显然是一个单峰序列 首先有一个结论:一个序列通过交换相邻的元素,进行排序,最少的交换次数为该序列的逆序对个数 (该结论很久之前打表意外发现的,没想到用上了.....) 考虑如何构 ...

  4. 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations

    题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...

  5. [bzoj4240]有趣的家庭菜园_树状数组

    有趣的家庭菜园 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4240 数据范围:略. 题解: 第一步比较简单,只需要排序之后,每个数不是在左边就 ...

  6. [BZOJ4240]有趣的家庭菜园(贪心+树状数组)

    最后数列一定是单峰的,问题就是最小化最后的位置序列的逆序对数. 从大到小加数,每次贪心看放左边和右边哪个产生的逆序对数更少,树状数组即可. 由于大数放哪对小数不产生影响,所以正确性显然. 注意相同数之 ...

  7. [bzoj4240] 有趣的家庭菜园

    还是膜网上题解QAQ 从低到高考虑,这样就不会影响后挪的草了. 每次把草贪心地挪到代价较小的一边.位置为i的草,花费为min( 1..i-1中更高的草的数目,i+1..n中更高的草的数目 ) 因为更小 ...

  8. [AGC006E] Rotate 3x3 树状数组+贪心

    Description ​ XFZ在北京一环内有一套房. ​ XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格.XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数 ...

  9. BZOJ 1106: [POI2007]立方体大作战tet 树状数组 + 贪心

    Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规 则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n ...

随机推荐

  1. 用户找回密码功能JS验证邮箱通过点击下一步隐藏邮箱输入框并修改下一步按钮的ID

    //这里是BaseDao /** * 获得一个对象 * @param hql * @param param * @return */ public Object get(String hql, Obj ...

  2. AbstractAdvisingBeanPostProcessor---spring aop 处理器

    开局一张图,我们先上张图 类的说明和继承关系/** * Base class for {@link BeanPostProcessor} implementations that apply a * ...

  3. zoj 2615 Cells 栈的运用

    题目链接:ZOJ - 2615 Scientists are conducting research on the behavior of a newly discovered Agamic Cell ...

  4. concurrencyProgrammingGuide 1

    thread用来表述执行代码的独立path.os x的线程执行基于POSIX 线程API. process用来表述一个运行操作,可以包含多个线程. task用来描述工作的抽象概念. Concurren ...

  5. flash+xml无法显示中文的解决办法

    flash+xml用来做图片动态浏览效果相当不错,被广泛运用于电子相册制作,很多朋友都会从网上下载一些相关的flash源码下载参考,但是经常发现在使用过程中,修改了xml文件中的英文后要么文本不显示, ...

  6. HTML5 Canvas 八星聚义动态效果

    昔有石碣村七星聚义,今有Canvas八星聚义.动态效果是,八颗星以等速螺线慢慢向中心聚集,最后汇聚成一颗. 效果: 代码: <!DOCTYPE html> <html lang=&q ...

  7. 全国车辆违章查询API文档及demo

    简介 聚合数据全国车辆违章API,目前已经支持300个左右的城市违章查询,已连接上万个APP.方便有车一族随时了解自己是否有过交通违章,避免因遗忘或逾期处理违章罚单而造成的不必要损失. API参考文档 ...

  8. 新安装的金蝶K3软件,初始化后,在基础资料中对于币别,科目,部门,客户等资料均无法新增,无法引出,等操作,K3CASysSet.dll

    新装K3,新建的帐套.导入科目点菜单或新增button均无反应,币别.客户等辅助核算项目也新增也无法保存. 在电脑上新安装的金蝶K3软件.初始化后.在基础资料中对于币别,科目,部门,客户等资料均无法新 ...

  9. 阿里云 RDS实例间的数据迁移

    使用数据传输DTS可以实现两个RDS实例间的数据迁移.对于支持增量迁移的存储引擎,还可以使用DTS在源RDS实例不停服的情况下,将数据迁移到目标RDS实例.目前对于RDS不同存储引擎,只支持同构迁移( ...

  10. SQLite基本(实例FileOrganizer2013.5.12)

    工具用 SQLite Dev   数据类型: 1.NULL:空值. 2.INTEGER:带符号的整型,具体取决有存入数字的范围大小. 3.REAL:浮点数字,存储为8-byte IEEE浮点数. 4. ...