HihoCoder - 1781: Another Bubble Sort (冒泡排序&逆序对)
Sample Input
3
9
8 7 5 1 9 2 6 4 3
1 2 3 4 5 6 7 8 9
9
8 7 5 1 9 2 6 4 3
1 2 5 4 3 6 7 8 9
9
8 7 5 1 9 2 6 4 3
1 2 5 6 4 3 7 8 9
Sample Output
Case #1: 6
Case #2: 4
Case #3: -1
Prof.Q is a sophisticated professor who has insights into quadrillions of sorting algorithms, especially into bubble sort. Bubble sort is a simple algorithm that repeatedly steps through the array to be sorted, compares each pair of adjacent elements and swaps them if they are in the wrong order. In brief, bubble sort executes the following iteration over and over again until the array is sorted.
This is your first day becoming a student of Prof.Q, so he gives you two arrays A[1..N] and B[1..N] of length N
as a placement test. Your task is to check whether it is possible to
execute the aforementioned iteration several times on the array A and then transform it into the array B. Furthermore, determine the minimum times of iteration to achieve it if it is possible.
Input
The first line contains one integer T, indicating the number of test cases.
The following lines describe all the test cases. For each test case:
The first line contains one integer N.
The second line contains N integers A[1], A[2], · · · , A[N].
The third line contains N integers B[1], B[2], · · · , B[N].
1 ≤ T ≤ 1000, 1 ≤ N ≤ 105 , 1 ≤ ai ≤ 109 (i = 1, 2, · · · , N).
It is guaranteed that the sum of N in all the test cases does not exceed 106.
Output
For each test case, print "Case #x: y" (without quotes) in one line, indicating that this is the x-th test case and the minimum number of iterations for this test case is y if it is possible, print y as −1 otherwise.
题意:冒泡排序,两个for语句,第一个表示进行了几轮,第二个表示从左往右遍历,如果左边的大于右边的,则交换。现在给定A数组,B数组。 问A数组是否可以根据上述的规则进行K轮排序得到B, 如果可以,求出K,否则输出-1;
思路:我们不难根据位置的变化得到K; 然后我们可以需要求出A数组进行K轮排序后的数组。 这里根据逆序对+二分来求得。
因为每一轮排序下来,新的逆序对rev和上一轮的关系是:rev[i]=max(pre[i+1],0);所以我们得到K轮后的结果,和B对比即可。
(注意这个数组的大小是1e9,我们需要离散化,即根据大小为第一关键字,位置为第二关键字排序。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
int a[maxn],rev[maxn],b[maxn],ans[maxn],pos[maxn],sum[maxn],N;
void add(int x,int v){ for(;x<=N;x+=(-x)&x) sum[x]+=v; }
int query(int x){int res=; for(;x;x-=(-x)&x) res+=sum[x]; return res;}
struct in{int x,pos; }s[maxn];
bool cmp(in w,in v ){ return w.x==v.x?w.pos<v.pos:w.x<v.x;}
void fcy(int f[]){
rep(i,,N) s[i].x=f[i],s[i].pos=i; sort(s+,s+N+,cmp);
rep(i,,N) f[s[i].pos]=i;
}
int main()
{
int T,C=,K;
scanf("%d",&T);
while(T--){
scanf("%d",&N); K=;
rep(i,,N) scanf("%d",&a[i]);
rep(i,,N) scanf("%d",&b[i]);
fcy(a); fcy(b); //离散化
rep(i,,N) pos[a[i]]=i;
rep(i,,N) K=max(K,pos[b[i]]-i); //求K
rep(i,,N) rev[i]=sum[i]=;
rep(i,,N) {
rev[i]=i--query(a[i]);
add(a[i],);
}//求A数组的逆序对
rep(i,,N) rev[i]=max(,i+K>N?:rev[i+K]-K);
rep(i,,N) sum[i]=;
rep(i,,N) add(i,);
for(int i=N;i>=;i--){
int L=,R=N,res;
while(L<=R){
int Mid=(L+R)>>;
if(query(Mid)>=i-rev[i]) res=Mid,R=Mid-;
else L=Mid+;
} ans[i]=res; add(res,-);
}//二分定位答案
rep(i,,N) if(ans[i]!=b[i]) {K=-; break;}
printf("Case #%d: %d\n",++C,K);
}
return ;
}
HihoCoder - 1781: Another Bubble Sort (冒泡排序&逆序对)的更多相关文章
- Bubble Sort冒泡排序
冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来. 下面这种图很清晰的解释了什么是冒泡算法. 具体算法描述如下: 1. 比较相 ...
- Bubble Sort 冒泡排序
//Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...
- HihoCoder - 1801 :剪切字符串 (置换与逆序对)
Sample Input 6 5 11 Sample Output 6 小Hi有一个长度为N的字符串,这个字符串每个位置上的字符两两不同.现在小Hi可以进行一种剪切操作: 选择任意一段连续的K个字符, ...
- c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,
#include <iostream.h> #define MAX 100 void dispaly(int a[],int n) { for(int i=0;i<n;i+ ...
- HDU 5775 Bubble Sort(冒泡排序)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Summary: Merge Sort of Array && 求逆序对
常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public ...
- 冒泡排序(Bubble Sort)
常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...
- [算法] 冒泡排序 Bubble Sort
冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...
随机推荐
- STL_算法_05_集合算法
◆ 常用的集合算法: 1. 1.1.第6讲 PPT.40 ◆ set_union() : 构造一个有序序列,包含两个有序序列的并集. 1.2.第6讲 PPT.40 ◆ set_intersectio ...
- Flutter学习笔记(三)-- 事件交互和State管理
先来看看准备界面: image.png 目标是修改图中红色实线框中的喜欢和不喜欢的五角星的修改,以及数字的修改. 在修改之前,有必要先了解一些相关的信息. 知识点 前面简单的提到过,有些Widget是 ...
- Redis之字符串类型命令
String(字符串) string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value. string 类型是二进制安全的.意思是 ...
- FASTQ 数据质量统计工具
主流工具: FastQC fqcheck readfq 拿到测序数据的第一步就是做质量控制 fqcheck之后得到的结果: 它会统计每条reads,按read 1-100位点计算每个位置的ACGTN含 ...
- 12月10日 render( locals:{...}) 传入本地变量。
Jdstor第一部分后台设计,4-4上传图片. 3.4 Using Partials--3.4.4 Passing Local Variables You can also pass local va ...
- 使用Maven + Jetty时,如何不锁定js css 静态资源
Jetty会使用内存映射文件来缓存静态文件,包括js,css文件. 在Windows下,使用内存映射文件会导致文件被锁定,所以当Jetty启动的时候无法在编辑器对js或者css文件进行编辑. 解决办法 ...
- 安装torch-opencv
安装torch-opencv torch torch-opencv opencv-3.1.0 opencv-contrib 想在torch中使用光流法,于是就希望能够调用opencv中的光流代码,而t ...
- hdu-4023-博弈(模拟)
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submis ...
- Eclipse重命名项目名后如何彻底修改工程名
背景:在Eclipse中当我们修改了一个Web项目名称后,在再次运行该项目,发现使用新的名称无法正常的浏览,而用旧的名称去可以 解决方案: 1:修改该项目目录下:.project文件 <?xml ...
- ShardedJedis的使用
假定有2个 redis 服务实例(A和B)在运行,在客户端进行 set 操作: set a0 xxx set a1 xxx set a2 xxx set a3 xxx 我们希望a0, a1, a2, ...