【bzoj4240】有趣的家庭菜园 贪心+树状数组
题目描述
输入
输出
样例输入
6
2
8
4
5
3
6
样例输出
3
题解
贪心+树状数组
一个结论:交换后形成的以原来位置为元素的序列的逆序对数为最小交换次数
举个例子:原来的数是1000 100 10 1,交换后形成了1 100 1000 10,则最小交换次数为4 2 1 3的逆序对数4。
那么根据这个结论,在这道题中,如果每个数都不相等,那么从小到大枚举每个数,它对答案的贡献是剩下的数中与它形成逆序对的数的个数,即位置比它大的数的个数和位置比它小的数的个数。
于是我们可以开两个树状数组,分别维护比一个数的位置大的数的个数和比一个数的位置小的数的个数,查询时对于两者取一个最小值即为答案。最后再把该数删除。
但是这样做可能会WA,因为可能存在相同的数。此时我们考虑:相同的数也一定是互不影响的,否则不会成为最优答案。于是我们可以先把相同的数删除掉,再进行查询即可。
#include <cstdio>
#include <algorithm>
#define N 300010
using namespace std;
struct data
{
int v , id;
}a[N];
int f1[N] , f2[N] , n;
bool cmp(data a , data b)
{
return a.v < b.v;
}
void add(int x , int a)
{
int i;
for(i = x ; i <= n ; i += i & -i) f1[i] += a;
for(i = x ; i ; i -= i & -i) f2[i] += a;
}
int query(int x)
{
int i , ans1 = 0 , ans2 = 0;
for(i = x ; i ; i -= i & -i) ans1 += f1[i];
for(i = x ; i <= n ; i += i & -i) ans2 += f2[i];
return min(ans1 , ans2);
}
int main()
{
int i , j;
long long ans = 0;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i].v) , a[i].id = i , add(i , 1);
sort(a + 1 , a + n + 1 , cmp);
for(i = 1 ; i <= n ; i = j)
{
for(j = i ; a[j].v == a[i].v ; j ++ ) add(a[j].id , -1);
for(j = i ; a[j].v == a[i].v ; j ++ ) ans += query(a[j].id);
}
printf("%lld\n" , ans);
return 0;
}
【bzoj4240】有趣的家庭菜园 贪心+树状数组的更多相关文章
- [BZOJ4240]有趣的家庭菜园(贪心+树状数组)
最后数列一定是单峰的,问题就是最小化最后的位置序列的逆序对数. 从大到小加数,每次贪心看放左边和右边哪个产生的逆序对数更少,树状数组即可. 由于大数放哪对小数不产生影响,所以正确性显然. 注意相同数之 ...
- [bzoj4240]有趣的家庭菜园_树状数组
有趣的家庭菜园 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4240 数据范围:略. 题解: 第一步比较简单,只需要排序之后,每个数不是在左边就 ...
- bzoj 4240: 有趣的家庭菜园【树状数组+贪心】
以为是逆序对数-- 实际上,原数组移动若干次后我们会得到一个新的下标序列,需要的移动次数是这个新下标序列的逆序对数 然后我们要让这个最小,考虑贪心先按h把下标排一遍序,然后每次询问到一种值的时候,对每 ...
- bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)
4240: 有趣的家庭菜园 题目:传送门 题解: 好题!%%% 一开始不知道在想什么鬼,感觉满足二分性?感觉可以维护一个先单调增再单调减的序列? 然后开始一顿瞎搞...一WA 看一波路牌...树状数组 ...
- [bzoj4240] 有趣的家庭菜园
还是膜网上题解QAQ 从低到高考虑,这样就不会影响后挪的草了. 每次把草贪心地挪到代价较小的一边.位置为i的草,花费为min( 1..i-1中更高的草的数目,i+1..n中更高的草的数目 ) 因为更小 ...
- gym 102082G BZOJ4240 贪心+树状数组
4240: 有趣的家庭菜园 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 756 Solved: 349[Submit][Status][Discu ...
- 贪心+树状数组维护一下 Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) D
http://codeforces.com/contest/724/problem/D 题目大意:给你一个串,从串中挑选字符,挑选是有条件的,按照这个条件所挑选出来的字符集合sort一定是最后选择当中 ...
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- [P4064][JXOI2017]加法(贪心+树状数组+堆)
题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...
随机推荐
- IIS 服务器支持下载apk 文件
前不久,在本地IIS文件下部署一个网站,可以下载apk文件,就是测试apk应用升级,发现访问不能下载,原因是IIS没有配置对这种apk文件的处理程序. 解决方案如下所示: 1.打开IIS, 找到MIM ...
- Java生成-zipf分布的数据集(自定义倾斜度,用作spark data skew测试)
1.代码 import java.io.Serializable; import java.util.NavigableMap; import java.util.Random; import jav ...
- 【读书笔记】构建之法(CH1~CH3)
人类文明的发展离不开哲学家的思考.科学家的发现和工程师的构建.三个简单的方程式解释了什么是现代软件工程: 1.程序=算法+数据结构 2.软件=程序+软件工程 3.软件企业=软件+商业模式 软件开发的不 ...
- freebsd安装ports
/etc/portsnap.conf 里面更改 SERVERNAME=portsnap.hshh.org portsnap的命令比较少 fetch 获取数据 extract 释放全部ports upd ...
- codevs 3278 最小m 段和问题
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定 n 个整数(不一定是正整数)组成的序列,现在要求将序列分割为 m 段,每段 ...
- Mysql 主备配置
来自:http://blog.csdn.net/u013256816/article/details/52536283 1. 了解主备配置过程原理. http://blog.csdn.net/u013 ...
- IE6 bug总结
IE6bug总结: 1.双边距bug产生原因 margin的方向与浮动的方向相同 解决方法: 浮动的元素身上加 display:inline; ---------------------------- ...
- python之路——目录
目录 python基础部分 基础部分 介绍.基本语法.流程控制 列表 元祖 字符串 字典 集合 文件操作 函数 变量 递归 迭代器,生成器,装饰器,Json和pickle 数据序列化 函数 初识函数 ...
- mask rcnn和roi-align
faster-rcnn的github源码中是round四舍五入 但kaiming he的ppt是直接取整 1.讲roi-align和roi-pooling区别并且详细阐述roi-align过程的博客: ...
- 14.list列表
1).列表的切片 li = ['德玛西亚',[1,2,3],'luokesasi','eson','女神','jingdongi'] l1 = li[0] print(l1) #>>> ...