【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 个区间里选出恰好 ...
随机推荐
- 关于软件测试(5):初识Peer Review
一.背景:这周的软件测试课堂上我们在自行分组的情况下,对姚同学的汽车停车位定位管理系统进行了Peer Review,中文就是同行测试.这也是我第一次接触同行测试,那接下来我先介绍一下Peer Revi ...
- mongo ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection refused
解决方法 rm /var/lib/mongodb/mongod.lock
- Codeforces Round #318 (Div. 2) D Bear and Blocks (数学)
不难发现在一次操作以后,hi=min(hi-1,hi-1,hi+1),迭代这个式子得到k次操作以后hi=min(hi-j-(k-j),hi-k,hi+j-(k-j)),j = 1,2,3... 当k ...
- C++类构造函数、析构函数运行机理
http://blog.sina.com.cn/s/blog_6fd68d5f0100n60h.html 前言--构造函数.析构函数的简单理解:1)构造函数---对象被创建时候调用的函数:2)析构函数 ...
- Xcode编译工具
一.关于Other Linker Flags xcode中,在“Targets”选项下有Other Linker Flags选项,在这里可以填写xcode链接器的参数,如:-ObjC.-all_loa ...
- scss引入的问题
导入.sass或.scss文件 css有一个不太常用的特性,即@import 导入功能,它允许在一个css文件中导入其他css文件.然而,结果是只有执行到@import 规则时,浏览器才会去下载其他c ...
- ucosii(2.89)semaphore 应用要点
semaphore 的作用:1,允许一个任务与其他任务(中断)同步.2,取得共享资源使用权.3,标志事件的发生.
- 【414】Code::Blocks增加主题
替换文件地址:C:\Users\z5194293\AppData\Roaming\CodeBlocks 文件下载地址:default.rar 通过 Settings -> Editor... - ...
- servlet上传多个文件(乱码解决)
首先,建议将编码设置为GB2312,并在WEB-INF\lib里导入:commons-fileupload-1.3.jar和commons-io-2.4.jar, 可百度下下载,然后你编码完成后,上传 ...
- WPF显示尺寸与设备无关问题
WPF单位 WPF窗口以及其中的所有元素都是用与设备无关的单位进行度量.一个与设备无关的单位被定义为1/96英寸.WPF程序统一用下面一个公式来定义物理单位尺寸: [ 物理单位尺寸(像素)] = [ ...