bzoj 4240: 有趣的家庭菜园 树状数组+贪心
有一个小性质:就是一个下标排列的最小移动次数就是逆序对数.
我们发现最终形态一定是一个波峰.
那么我们求的就是形成波峰的下标最少逆序对数.
考虑将元素从小到大依次插入.
那么,对于第 $i$ 个元素,一定是放到左面或右面(就是从 1....left 或 right....n) 中的left和right.
那么,考虑一个元素新放进去会对后面元素产生的逆序对:
放左:后面插入的下标比当前下标小的.
放右:后面插入的下标比当前下标大的.
由于我们在每次插入时已经计算完了插入元素和后面要插入元素的逆序对数.
所以新插入时无需考虑与先前数字的逆序对数.
所以每一步就贪心取最小就行了.
一个细节:相同大小元素要同时插入,否则会多算.
code:
#include <bits/stdc++.h>
#define N 300005
#define LL long long
using namespace std;
void setIO(string s)
{
string in=s+".in";
string out=s+".out";
freopen(in.c_str(),"r",stdin);
// freopen(out.c_str(),"w",stdout);
}
struct node
{
int h,pos;
}a[N];
int n;
int A[N],C[N];
bool cmp(node a,node b) { return a.h<b.h; }
int lowbit(int t) { return t&(-t); }
void update(int x,int v)
{
while(x<N) C[x]+=v,x+=lowbit(x);
}
int query(int x)
{
int re=0;
while(x>0) re+=C[x],x-=lowbit(x);
return re;
}
int main()
{
// setIO("input");
LL ans=0ll;
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&a[i].h),a[i].pos=i,A[i]=a[i].h;
sort(A+1,A+1+n);
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;++i) a[i].h=lower_bound(A+1,A+1+n,a[i].h)-A, update(i,1);
for(i=1;i<=n;i=j)
{
for(j=i;a[j].h==a[i].h;++j) update(a[j].pos,-1);
for(j=i;a[j].h==a[i].h;++j)
{
int re=query(a[j].pos);
ans+=1ll*min(re, query(n)-re);
}
}
printf("%lld\n",ans);
return 0;
}
bzoj 4240: 有趣的家庭菜园 树状数组+贪心的更多相关文章
- bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)
		
4240: 有趣的家庭菜园 题目:传送门 题解: 好题!%%% 一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列? 然后开始一顿瞎搞...一WA 看一波路牌...树状数组 ...
 - 【BZOJ4240】有趣的家庭菜园 树状数组+贪心
		
[BZOJ4240]有趣的家庭菜园 Description 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IO ...
 - 【bzoj4240】 有趣的家庭菜园 树状数组
		
这一题最终要构造的序列显然是一个单峰序列 首先有一个结论:一个序列通过交换相邻的元素,进行排序,最少的交换次数为该序列的逆序对个数 (该结论很久之前打表意外发现的,没想到用上了.....) 考虑如何构 ...
 - bzoj 4240: 有趣的家庭菜园【树状数组+贪心】
		
以为是逆序对数-- 实际上,原数组移动若干次后我们会得到一个新的下标序列,需要的移动次数是这个新下标序列的逆序对数 然后我们要让这个最小,考虑贪心先按h把下标排一遍序,然后每次询问到一种值的时候,对每 ...
 - 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
		
题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...
 - BZOJ.4888.[TJOI2017]异或和(树状数组)
		
BZOJ 洛谷 \(Description\) 求所有区间和的异或和. \(n\leq 10^5,\ \sum a_i\leq 10^6\). \(Solution\) 这样的题还是要先考虑按位做. ...
 - BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
		
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
 - bzoj 3730 震波——动态点分治+树状数组
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3730 查询一个点可以转化为查询点分树上自己到根的路径上每个点对应范围答案.可用树状数组 f ...
 - BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
		
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
 
随机推荐
- go context 源码分析
			
WithCancel func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := newCancelCtx(pare ...
 - 开始Jupyter Notebooks
			
开始Jupyter Notebooks 安装Anaconda 因为不能有空格,所以没有选C:\Program Files 认识Jupyter Notebooks 修改 jupyter notebook ...
 - RabbitMQ集群部署、高可用和持久化
			
RabbitMQ 安装和使用 1.安装依赖环境 在 http://www.rabbitmq.com/which-erlang.html 页面查看安装rabbitmq需要安装erlang对应的版本 在 ...
 - Powershell学习笔记:(二)、基础知识
			
从Window7以后,WIndows系统都自带了Windows PowerShell. 自带版本如下 WIndow7 2.0 WIndow8 3.0 Window8.1 4.0 Win ...
 - 使用其他身份运行计算机(DOS命令)
			
runas/user:administrator cmd d: cd esop sfispri.ini
 - 《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么
			
1 程序的运行流程 2 CPU的组成 3 寄存器的主要种类和功能 "程序计数器"--决定程序流程的 4 条件分支和循环机制 4.1 顺序执行 4.2 选择分支 5 函数的调用机制 ...
 - Java Web 深入分析(10) Spring  实践
			
Spring helloworld [http://wiki.jikexueyuan.com/project/spring/hello-world-example.html] HelloWorld.j ...
 - 前端之:传统的DOM是如何渲染的?
			
a.纯后端渲染:页面发送请求,后端服务器中将数据拼成完整DOM树,并转换成一个字节流作为HTTP Response的body返回给浏览器.优点在于 返回的HTTP Response是包含着全部页面内容 ...
 - 虹软人脸识别 - faceId及IR活体检测的更新介绍
			
虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...
 - java判定数据(对象)类型
			
1.说明一 int 是关键字,Integer是包装类,Number是所有数字了的基类(父类).所以,Number是Integer的基础,Integer是int的基础,也称Integer是int的原型类 ...