随笔分类 - ACM / 排序
摘要:原题链接 考察:排序,前缀和思想 错误思路: 建立d,p的树状数组,对于每一个查询是否有 <\(d[i]\)&&<$p[i]$的 错误原因: 显然p,d是一体的不能分开. 正确思路: 结构体排序按p,d优先顺序排序,对于每一个$p[i]\(,查询\)<p[i]$的最小$d[i]\(,如果\)>=d[
阅读全文
摘要:原题链接 考察:树状数组 +贪心 or归并排序+贪心 思路: 首先一个定理:冒泡排序的交换次数 = 逆序对个数.证明: 冒泡排序每次交换减少一个逆序对,当最后逆序对数量 = 0,交换次数>=k. 又因为每次只能减少一个.那么必然可以取到k.对于某一个人i而言,i前面>hi有k个,后面<hi有t个.k
阅读全文
摘要:原题链接 考察: 归并排序 八数码的延伸版,这里允许了N为偶数,所以要分情况讨论 当N为偶数,向下挪一行奇偶改变,再向下挪奇偶又改变,因此答案和0的位置有关 易错: 判断条件的时候,&1两边都要打括号不然报错 1 #include <iostream> 2 #include <algorithm>
阅读全文
摘要:原题链接 考察:归并排序 n恒为奇数,所以左右上下移动不会改变逆序对的奇偶性. 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 const int N = 250010; 5 typedef long long
阅读全文
摘要:原题链接 考察:归并排序 思路: 这道题的延伸 1215. 小朋友排队 很明显就是求逆序对,借着这道题复习逆序对了 lyd大佬的方法待补,我是真的看不懂他的算法 1 #include <iostream> 2 using namespace std; 3 #define ll long long 4
阅读全文
摘要:原题链接 考察:快速排序 思路: 快速排序的原理是将小于基准点的数全部放在基准点左边,大于全部放在右边,等于随机.我们要找第k小的数,当快速排序把区间一分为2的时候,如果左边的长度>k,说明第k小的数在左边,如果<说明要找右边找k-cnt(左边的长度)个数. 当我们不断递归的时候,区间会减小通过计算
阅读全文
摘要:原题链接 考察:堆排序 这里涉及一个新算法:对顶堆. 其实我也第一次学 思路: 设序列长度为M,用小顶堆维护序列中M/2+1~M个数,用大顶堆维护1~M/2个数,我们动态地维护输入的数字,如果当前数比小顶堆的堆顶小就加入大顶堆,如果大就加入小顶堆.要注意我们必须保证大顶堆的size不能超过M/2,小
阅读全文
摘要:原题链接 考察: 堆排序+归并排序 错误思路: 将m个序列排序,堆储存,每个序列都选第一个,选完后pop掉堆顶最大的. 时间复杂度大概是O(mlogn+n*m),但是不能pop掉最大的,如果遇到 a {1,2,2} b{2,9,10}就是输出{3,10,11}的错误答案. 也就是a1+b2不一定比b
阅读全文