Bubble Sort

Problem Description
  P is a permutation of the integers from 1 to N(index starting from 1).
Here is the code of Bubble Sort in C++.

for(int i=1;i<=N;++i)
for(int j=N,t;j>i;—j)
if(P[j-1] > P[j])
t=P[j],P[j]=P[j-1],P[j-1]=t;

After the sort, the array is in increasing order. ?? wants to know the absolute

values of difference of rightmost place and leftmost place for every number it reached.
 
Input
   The first line of the input gives the number of test cases T; T test cases follow.
   Each consists of one line with one integer N, followed by another line with a
permutation of the integers from 1 to N, inclusive.

limits
T <= 20
1 <= N <= 100000
N is larger than 10000 in only one case. 

 
Output
    For each test case output “Case #x: y1 y2 … yN” (without quotes), where x is
the test case number (starting from 1), and yi is the difference of rightmost place
and leftmost place of number i.
 

Sample Input

2
3
3 1 2
3
1 2 3
 
Sample Output
Case #1: 1 1 2
Case #2: 0 0 0
 
Hint
In first case, (3, 1, 2) -> (3, 1, 2) -> (1, 3, 2) -> (1, 2, 3)
the leftmost place and rightmost place of 1 is 1 and 2, 2 is 2 and 3, 3 is 1 and 3
In second case, the array has already in increasing order. So the answer of every number is 0.

题意:

给你一个1到n的排列,然后按照冒泡排序的移动方式,问每个i 能移动到的最左位置和最右位置的差是多少

分析:在冒泡排序过程的变化情况。c会被其后面比c小的数字各交换一次,之后c就会只向前移动。

数组从右向左扫,树状数组维护一下得到每个值左边有多少个比其小的值通过转换得到每个值右边有多

少个比其小的值,加上原位置得到最右位置,最左位置为初始位置和最终位置的最小值。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn = ;
int n;
int a[maxn], b[maxn],c[maxn],C[maxn];
void add(int x){
while(x<=n) C[x]++,x+=(x&-x);
//cout<<"x: "<<x<<" C[x]: "<<C[x]<<endl,
} int sum(int x){
int ans=;
while(x>)
ans+=C[x],x-=(x&-x);
//cout<<"ans: "<<ans<<endl;
return ans;
} int main()
{
int t;
int kase = ;
scanf("%d", &t);
while(t--)
{
memset(c, , sizeof(c));
memset(b, , sizeof(b));
int i;
scanf("%d", &n);
for(i=; i<=n; i++ )
{
scanf("%d", &a[i]);
b[a[i]] = i;
}
memset(C,,sizeof(C));
for(int i=;i<=n;i++){
c[i]=sum(a[i]-);
add(a[i]);
// cout<<c[i]<<".."<<endl;
} sort(a+,a+n+);
printf("Case #%d:", ++kase);
for(i = ; i <= n; i++ )
{
int x=i-c[b[i]]-;
printf(" %d", max(abs(b[i]+x-b[i]),abs(b[i]+x-i))); }
printf("\n");
} return ;
}
//自己的绕了点弯路
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
int C[maxn],a[maxn],id[maxn],l[maxn],r[maxn],n; void add(int x){
while(x<=n) {
C[x]++,x+=(x&-x);
}
} int sum(int x){
int ans=;
while(x>)
ans+=C[x],x-=(x&-x);
return ans;
} int main(){
int _;
scanf("%d",&_);
for(int case1=;case1<=_;case1++){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),l[a[i]]=i;
memset(C,,sizeof(C));
for(int i=n;i>=;i--){
r[a[i]]=i+sum(a[i]-);
add(a[i]);
}
printf("Case #%d: ",case1);
for(int i=;i<=n;i++){
if(i!=n)
printf("%d ",r[i]-min(l[i],i));
else
printf("%d\n",r[i]-min(l[i],i));
}
}
return ;
}
//网上的

Bubble Sort (5775)的更多相关文章

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

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

  2. Bubble Sort(冒泡排序)

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

  3. erlang下lists模块sort(排序)方法源码解析(二)

    上接erlang下lists模块sort(排序)方法源码解析(一),到目前为止,list列表已经被分割成N个列表,而且每个列表的元素是有序的(从大到小) 下面我们重点来看看mergel和rmergel ...

  4. erlang下lists模块sort(排序)方法源码解析(一)

    排序算法一直是各种语言最简单也是最复杂的算法,例如十大经典排序算法(动图演示)里面讲的那样 第一次看lists的sort方法的时候,蒙了,几百行的代码,我心想要这么复杂么(因为C语言的冒泡排序我记得不 ...

  5. HDU 5775 Bubble Sort (线段树)

    Bubble Sort 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

  6. HDU 5775:Bubble Sort(树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Problem Description   P is a permutation ...

  7. POJ3761 Bubble Sort (组合数学,构造)

    题面 Bubble sort is a simple sorting algorithm. It works by repeatedly stepping through the list to be ...

  8. 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. Comparators.sort (转载)

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

随机推荐

  1. springmvc结合ajax实现跨域上传文件

    本方法的思路是:先在前端利用FileReader将图片转换成base64编码,然后将编码字符串形式传递到后台(前提是服务端设置了允许跨域),后端再把base64编码转换成图片. 前端代码: <! ...

  2. [MySQL]MySQL之权限管理

    一.MySQL权限简介 关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界.比如只允许你执行select操作,那么你就不能执行update操作.只允许你从某台机器上连接m ...

  3. CentOS系统中基于Apache+php+mysql的许愿墙网站的搭建

    1.首先,我们需要两台虚拟机(CentOS7,Linux文本). 2.给两台虚拟机配置网络环境分别为桥接模式 CentOS7 ip为192.168.100.139.24,linux文本ip为192.1 ...

  4. C++小结

    1.输入:cin>>变量名: 输出:cout<<变量名<<endl: 2.类 public 公有,此类及其他类中使用   private 私有,只能在本类中使用   ...

  5. android 6.0 高通平台sensor 工作机制及流程(原创)

    最近工作上有碰到sensor的相关问题,正好分析下其流程作个笔记. 这个笔记分三个部分: sensor硬件和驱动的工作机制 sensor 上层app如何使用 从驱动到上层app这中间的流程是如何 Se ...

  6. 解决Mysql连接池被关闭 ,hibernate尝试连接不能连接的问题。 (默认mysql连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池。系统发布第二天访问链接关闭问题。

    解决Mysql连接池被关闭  ,hibernate尝试连接不能连接的问题. (默认MySQL连接池可以访问的时间为8小时,如果超过8小时没有连接,mysql会自动关闭连接池. 所以系统发布第二天访问会 ...

  7. ASP.NET获取百度地图提供的API接口里面的JSON

    思路:开始是想直接在前台获取,但是跨域访问还是有点难度,而且格式必须是josnp格式的,最后嫌麻烦,不得已放弃. 我做的ASP.NET  而这个有自带的解析类,直接引用就行了 先在后台获取到JOSN: ...

  8. 剑指Offer-【面试题04:替换空格】

    package com.cxz.question4; /* * 请实现一个函数,把字符串中的每个空格替换成"%20",例如"We are happy.",则输出 ...

  9. Android-Menu [使用C# And Java实现]

    本篇是对安卓菜单使用编程方式实现,当然可以使用XML的方式完成同样的功能,基本Java和C#写法都是一致的,所以使用XML的方式在本篇中使用Java演示,需要注意的是,对于如果不是VS开发的话,那么资 ...

  10. 制作bat脚本,抓取Android设备logcat

    ::bat制作抓取Android设备的logcat,并保存以时间命名的txt文件至设备目录 1 @ECHO off adb wait-for-device ECHO 正在连接设备 adb logcat ...