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 (冒泡排序&逆序对)的更多相关文章

  1. Bubble Sort冒泡排序

    冒泡排序是一种简单的排序算法. 它每次重复的访问过要排序的数列, 一次比较两个元素, 如果他们的顺错误, 就把他们交换过来. 下面这种图很清晰的解释了什么是冒泡算法. 具体算法描述如下: 1. 比较相 ...

  2. Bubble Sort 冒泡排序

    //Bubble Sort ( O(n²)) public class TestBubbleSort { public int[] bubbleSortArray(int[] arr){ ; i &l ...

  3. HihoCoder - 1801 :剪切字符串 (置换与逆序对)

    Sample Input 6 5 11 Sample Output 6 小Hi有一个长度为N的字符串,这个字符串每个位置上的字符两两不同.现在小Hi可以进行一种剪切操作: 选择任意一段连续的K个字符, ...

  4. c++算法联系,冒泡排序,bubble sort,插入排序,insert sort,

    #include <iostream.h> #define  MAX 100 void dispaly(int a[],int n) {     for(int i=0;i<n;i+ ...

  5. HDU 5775 Bubble Sort(冒泡排序)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  6. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  7. Summary: Merge Sort of Array && 求逆序对

    常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public ...

  8. 冒泡排序(Bubble Sort)

    常见的排序算法有Bubble Sort.Merge Sort.Quick Sort 等,所有排序算的基本法思想都是把一个无限大的数据规模通过算法一步步缩小,指导最后完成排序. 这里分享一下Buuble ...

  9. [算法] 冒泡排序 Bubble Sort

    冒泡排序(Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

随机推荐

  1. 虚函数_构造函数_测试_VS2010x86

    1.控制台测试代码: #include <stdio.h> #include <windows.h> class A { public: A() { printf(" ...

  2. json 与 string 互转

    1. json字符串转换成json对象 js: JSON.parse('{"age":"28"}') eval('(' + '{"age": ...

  3. 【备档】客户端自动化(主Android Appium + python

    之前做分享写的文档,备档~ 0.移动客户端自动化简介 客户端自动化测试的本质 定位对象 · 操作对象 · 校验对象 对象的定位应该是自动化测试的核心,要想操作.校验一个对象,首先应该识别这个对象. 一 ...

  4. 16S 基础知识、分析工具和分析流程详解

    工作中有个真理:如果你连自己所做的工作的来龙去脉都讲不清楚,那你是绝对不可能把这份工作做好的. 这适用于任何行业.如果你支支吾吾,讲不清楚,那么说难听点,你在混日子,没有静下心来工作. 检验标准:随时 ...

  5. 最短路-Prim算法 dijkstra算法

    HDU-1233 #include <iostream> #define INF 1000000 using namespace std; ][]; ]; ]; ]; ]; int mai ...

  6. USACO 铂金 T1

    题意 给出一个数轴,每次可以选择停下并得到当前点的收益,或者继续随机向左右游走,走到边界游戏结束收益为0. 求从每个点出发的最大期望收益.(n<=1e5) 有一个显然的dp方程 这个方程是带环的 ...

  7. DZY Loves Colors CodeForces - 444C (线段树势能分析)

    大意:有$n$个格子, 初始$i$位置的颜色为$i$, 美丽值为0, 有两种操作 将区间$[l,r]$内的元素全部改为$x$, 每个元素的美丽值增加$|x-y|$, $y$为未改动时的值 询问区间$[ ...

  8. 删除php数组中的元素

    删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: <?php $array = array(0 => "a", 1 => "b&qu ...

  9. 『PyTorch』第十三弹_torch.nn.init参数初始化

    初始化参数的方法 nn.Module模块对于参数进行了内置的较为合理的初始化方式,当我们使用nn.Parameter时,初始化就很重要,而且我们也可以指定代替内置初始化的方式对nn.Module模块进 ...

  10. spfa毒瘤算法

    终于知道怎么卡spfa(不优化)这一毒瘤算法了 下面就是造数据代码,点数才1e5,边数379980 随便测了一组数据: count: 831841219(入队次数) 68917.096 ms(足够t到 ...