bzoj4240: 有趣的家庭菜园(树状数组+贪心思想)
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: 有趣的家庭菜园(树状数组+贪心思想)的更多相关文章
- 【BZOJ4240】有趣的家庭菜园 树状数组+贪心
[BZOJ4240]有趣的家庭菜园 Description 对家庭菜园有兴趣的JOI君每年在自家的田地中种植一种叫做IOI草的植物.JOI君的田地沿东西方向被划分为N个区域,由西到东标号为1~N.IO ...
- bzoj 4240: 有趣的家庭菜园 树状数组+贪心
有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素, ...
- 【bzoj4240】 有趣的家庭菜园 树状数组
这一题最终要构造的序列显然是一个单峰序列 首先有一个结论:一个序列通过交换相邻的元素,进行排序,最少的交换次数为该序列的逆序对个数 (该结论很久之前打表意外发现的,没想到用上了.....) 考虑如何构 ...
- 线段树+树状数组+贪心 HDOJ 5338 ZZX and Permutations
题目传送门 /* 题意:不懂... 线段树+树状数组+贪心:贪心从第一位开始枚举,一个数可以是循环节的末尾或者在循环节中,循环节(循环节内部是后面的换到前面,最前面的换到最后面).线段树维护最大值,树 ...
- [bzoj4240]有趣的家庭菜园_树状数组
有趣的家庭菜园 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=4240 数据范围:略. 题解: 第一步比较简单,只需要排序之后,每个数不是在左边就 ...
- [BZOJ4240]有趣的家庭菜园(贪心+树状数组)
最后数列一定是单峰的,问题就是最小化最后的位置序列的逆序对数. 从大到小加数,每次贪心看放左边和右边哪个产生的逆序对数更少,树状数组即可. 由于大数放哪对小数不产生影响,所以正确性显然. 注意相同数之 ...
- [bzoj4240] 有趣的家庭菜园
还是膜网上题解QAQ 从低到高考虑,这样就不会影响后挪的草了. 每次把草贪心地挪到代价较小的一边.位置为i的草,花费为min( 1..i-1中更高的草的数目,i+1..n中更高的草的数目 ) 因为更小 ...
- [AGC006E] Rotate 3x3 树状数组+贪心
Description XFZ在北京一环内有一套房. XFZ房子的地砖呈网格状分布,是一个3∗N3∗N的网格.XFZ在买下这套房时,每个地砖上有一个数字,位置为(i,j)(i,j)的地砖上的数 ...
- hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)
Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
随机推荐
- .net core2.0 中使用log4net
一.nuget安装log4net 二.添加log4net.config配置文件 <?xml version="1.0" encoding="utf-8"? ...
- sql--Truncate Table
Truncate Table(截断表) 有时候需要清除一个表中的所有资料.要达到者个目的,一种方式是DROP TABLE 指令.不过这样整个表格就消失,而无法再被用了. 另一种方式是Delete不带w ...
- React Component(dva)
Stateless Functional Components(3种方式) class App extends React.Component function App() const App= Re ...
- 关于17个Cr的430采购的注意事项 430F
430F不锈钢是在430钢上加上易切削性能的钢种.用于自动车床.螺栓和螺母等.430LX在430钢中添加Ti或Nb.降低C含量,改善了加工性能的和焊接性能.用于热水罐.供热水系统.卫生器具.家庭用耐用 ...
- Android_方向传感器
Android方向传感器小案例,主要代码如下: package com.hb.direction; import android.app.Activity; import android.conten ...
- 【python】os.getcwd和getcwdu
print os.getcwd(), type(os.getcwd()) print os.getcwdu(), type(os.getcwdu()) 结果如下: C:\Users\Administr ...
- drf04 drf视图类
REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写. 1.2个视图基类 1.1. APIView rest_framework.views.APIView APIView ...
- BZOJ 1740: [Usaco2005 mar]Yogurt factory 奶酪工厂 贪心 + 问题转化
Description The cows have purchased a yogurt factory that makes world-famous Yucky Yogurt. Over the ...
- 终于等到你!微软正式上线 Windows Terminal 预览版
前一段时间,一直在知乎.技术社区收到技术小伙伴们的终极拷问:微软Build 大会上提到的**6月中旬**要上Windows store 的 Windows Terminal 到底啥时候可以用到呀? 有 ...
- Windows下Jupyter notebook 修改默认打开(工作、保存)文件夹(路径)
今天晚上兴致一起突然想看看我写了那么多的ipynb文件都去哪了 首先查了一下,应该是都默认保存到 C:\Users\芩溪儿 路径下了 然后我就想,我是不是得改改啊,总在那跟别的文件夹在一起总 ...