4240: 有趣的家庭菜园

题目:传送门


题解:

   好题!%%%

   一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列?

   然后开始一顿瞎搞...一WA

   看一波路牌...树状数组+贪心...起手就是一发伏地膜大师

  mdzz一个超级沙比但是经常被忽略的结论:对于最后操作完的序列,我们把原来的下标取出求一遍逆序对就是操作次数了啊

   模型转化为求一个最终序列使得逆序对数最少

   补一个树状数组求逆序对:对于当前数x,考虑以权值建树状数组,getsum求出小于等于x的数的个数,用sum减一下就OK

   那么我们把高度排序(肯定从大到小放),最高的放中间,后面的考虑放在左边和右边的逆序对影响。

   坑点:要记得消去相同数的影响啊,因为相同的两个数挨在一起交不交换无所谓啊...

  


代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x) x=read()
#define inf 1e9
using namespace std;
typedef long long LL;
inline int read() {
int f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
int n,s[],a[],w[];
int lowbit(int x){return x&-x;}
void change(int x,int c){while(x<=n)s[x]+=c,x+=lowbit(x);}
int getsum(int x){int ans=;while(x)ans+=s[x],x-=lowbit(x);return ans;}
bool cmp(int i,int j){return a[i]>a[j];}
int main() {
qread(n);for(register int i=;i<=n;++i)qread(a[i]),w[i]=i;sort(w+,w+n+,cmp);
LL ans=;int x;a[w[]]=a[w[]];
for(register int i=;i<=n;i=x+) {
int sum=i-;
for(register int j=i;j<=n;++j) { //去重
int s=getsum(w[j]);
ans+=LL(min(sum-s,s));//考虑左右两边的影响
x=j;if(a[w[j+]]!=a[w[j]])break;
}
for(register int j=i;j<=x;++j)change(w[j],);//释放影响
}
printf("%lld\n",ans);
return ;
}

bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)的更多相关文章

  1. 【BZOJ4240】有趣的家庭菜园 树状数组+贪心

    [BZOJ4240]有趣的家庭菜园 Description 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IO ...

  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. hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)

    Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

随机推荐

  1. Java 基本的递归写法

    1.首先我们得有一个树状结构的表,类似这种结构.必须得有 id,pid  其他的根据需要来. 我们叫它treeTbl表吧.这里pid为0的表示是顶级节点. 2.接着select * from tree ...

  2. OI知识点

  3. 网站html代码解析

    1.什么是HTML文件?HTML中文叫做“超文本标记语言”,一个HTML文件不仅包含文本内容,还包含一些标记,一个HTML文件的后缀名是.htm或者是.html.用文本编辑器(Dreamweaver) ...

  4. springboot + sharding-jdbc 学习

    官网地址:http://shardingsphere.io/document/current/cn/overview/ sharding-jdbc事务:https://blog.csdn.net/ya ...

  5. java程序员级别划分

    IT路虽好,却难走.1级   为会基本语法 大学里的JAVA教程 能及格 2级   自己可以写个 俄罗斯方块,扫雷,贪吃蛇, 拼图之类的小游戏 3级   能够进手机游戏CP,SP公司,做手机游戏 或者 ...

  6. (转)基于MVC4+EasyUI的Web开发框架经验总结(14)--自动生成图标样式文件和图标的选择操作

    http://www.cnblogs.com/wuhuacong/p/4093778.html 在很多Web系统中,一般都可能提供一些图标的选择,方便配置按钮,菜单等界面元素的图标,从而是Web系统界 ...

  7. 49.filter、query比较

    主要知识点 1.filter与query用在同一次查询中的语法 2.filter与query使用场景对比 3.二都的性能比较     一.filter与query示例 1.先准备数据 PUT /com ...

  8. 阿里云对象存储服务,OSS使用经验总结,图片存储,分页查询

    阿里云OSS-使用经验总结,存储,账号-权限,分页,缩略图,账号切换 最近项目中,需要使用云存储,最后选择了阿里云-对象存储服务OSS.总的来说,比较简单,但是仍然遇到了几个问题,需要总结下. 1.O ...

  9. 【Codeforces 229B】Planets

    [链接] 我是链接,点我呀:) [题意] [题解] 设dis[i]表示到达i号传送器的最早时刻. 显然,虽然有那么多的出发时刻的限制,但我们还是越早到越好的. 因为你到得越早,出发的时间肯定不会比到达 ...

  10. (14)Spring Boot定时任务的使用【从零开始学Spring Boot】

    本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了. com.kfit.base.scheduling.SchedulingConfig: package com. ...