Ultra-QuickSort ————分治 妖狐艹你老母 2022-05-17 00:52 114阅读 0赞 n this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence 9 1 0 5 4 , Ultra-QuickSort produces the output 0 1 4 5 9 . ![这里写图片描述][b3530eaa8fa98ef394d3639722240a8c_v_1532766237] Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence. **Input** The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 – the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a\[i\] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed. **Output** For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence. **Sample Input** 5 9 1 0 5 4 3 1 2 3 0 **Sample Output** 6 0 -------------------- 就是求逆序数对数 -------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; typedef long long ll; vector<int> A; int n; ll merge_count(vector<int> &a) { int n=a.size(); if(n<=1) return 0; ll cnt=0; vector<int> b(a.begin(),a.begin()+n/2); vector<int> c(a.begin()+n/2,a.end()); cnt += merge_count(b); cnt += merge_count(c); int ai=0,bi=0,ci=0; while(ai<n) { if(bi<b.size() && (ci == c.size() || b[bi] <= c[ci])) a[ai++] = b[bi++]; else { cnt += n / 2 - bi; a[ai++] = c[ci++]; } } return cnt; } int main() { while(~scanf("%d",&n)&&n) { int x; A.clear(); for(int i=0;i<n;i++) { scanf("%d",&x); A.push_back(x); } printf("%lld\n",merge_count(A)); } return 0; } [b3530eaa8fa98ef394d3639722240a8c_v_1532766237]: https://odzkskevi.qnssl.com/b3530eaa8fa98ef394d3639722240a8c?v=1532766237
相关 分治算法 问题描述 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的L型骨牌覆盖给定的特 约定不等于承诺〃/ 2024年02月17日 21:39/ 0 赞/ 75 阅读
相关 分治算法 划分问题:整个问题划分成多个无关联的子问题。 递归求解:递归调用求解各个子问题。 合并问题:合并子问题的解,形成原始问题的解。 ------------------- 港控/mmm°/ 2022年12月12日 04:58/ 0 赞/ 174 阅读
相关 分治策略 分治法基本思想:问题分解(分解成k个规模大致相同的子问题)、子问题递归求解、合并各个子问题的解。 对k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问 ゝ一世哀愁。/ 2022年06月09日 09:15/ 0 赞/ 200 阅读
相关 分治法 问题描述:假定一个已经排好顺序的一维数组,运用二分搜索算法,使得当前输入元素x不在数组中是,返回小于x的最大元素位置i和大于x的最小元素的位置j,当搜索元素在数组中,i 和j 怼烎@/ 2022年06月03日 05:52/ 0 赞/ 247 阅读
相关 分治法 Problem1一元三次方程的解 题目描述 有形如:ax3+bx2+cx+d=0这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d均为实数),并约定该方程存在三 ╰半夏微凉°/ 2022年01月06日 22:11/ 0 赞/ 281 阅读
相关 边分治 跟点分治差不多的东西,先转二叉,然后找边,分治。可以动态,还听说有个骚操作叫边分树合并... 注意虚点虚边的处理!注意边分治不能善终,\_n = 1的时候特判。 ![Con 野性酷女/ 2021年12月22日 16:49/ 0 赞/ 287 阅读
相关 cdq分治 0x00 前言 话说cdq应该大写还是小写。。。。。 -------------------- 0x01 什么是cdq分治? 设问题区间为\[L,R\],中点为 素颜马尾好姑娘i/ 2021年12月17日 07:49/ 0 赞/ 244 阅读
相关 点分治 [传送门][Link 1](洛谷) UPDATE:关于代码中时间复杂度的更正——在代码中每一次都要通过遍历一遍询问来得到答案,所以时间复杂度是O(NMlogN), ! - 日理万妓/ 2021年12月13日 05:04/ 0 赞/ 309 阅读
相关 分治算法 可能我太菜了 ,众多题解 的t0\t0 +t1\t2\2始终没看懂 分治大模拟好! include<bits/stdc++.h> using nam 妖狐艹你老母/ 2021年10月24日 00:20/ 0 赞/ 356 阅读
相关 分治算法 一 分治算法介绍 1 分治法是一种很重要的算法 字面上的解释是“分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……,直 冷不防/ 2021年07月24日 21:35/ 0 赞/ 431 阅读
还没有评论,来说两句吧...