问题描述

给定一个 1~N 的排列 P,即 1 到 N 中的每个数在 P 都只出现一次。 现在要
对排列 P 进行冒泡排序,代码如下:
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;
在排序过程中,数字的位置可能会发生变化。对于 1~ N 的每个数字,你需
要输出过程中达到的最左位置下标和最右位置下标的差的绝对值。

★数据输入
第一行为 N,表示排列长度。
第二行为排列 P。
数据保证:
80%的数据, N <= 1000
100%的数据, N <= 100000

★数据输出
输出一行,第 i 个数字表示数字 i 最左与最右位置的差的绝对值。

输入示例 输出示例
4
3 2 1 4
2 1 2 0

★注释
样例冒泡排序过程:
swap 2 1: 3 2 1 4 > 3 1 2 4
swap 3 1: 3 1 2 4 > 1 3 2 4
swap 3 2: 1 3 2 4 > 1 2 3 4

思路

  定义结构体,成员有:data(数据值、排序后下标)、pos(排序前下标)、num(当前数右边比它小的数)

  归并,过程中统计数右边比它小的数,更新num

  最大下标为pos+num,最小下标为data或pos

  PS:好像用树状数组做也可以,但是我不会╮(๑•́ ₃•̀๑)╭

code

 #include <stdio.h>
#include <stdlib.h> struct Node
{
int data;
int pos;
int num;
}; Node *buf; inline int max(int a, int b)
{
return a>b?a:b;
}
inline int min(int a,int b)
{
return a<b?a:b;
} void mergesort(Node *arr, int l,int r)
{
if(l>=r) return ;
if(l+==r)
{
if(arr[l].data > arr[r].data)
{
Node tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
arr[r].num++;
}
} int m = (l+r)/;
int i,j,k;
int num=;
mergesort(arr,l,m);
mergesort(arr,m+,r);
for(i=l;i<=r;i++) buf[i] = arr[i];
for(k=l,i=l,j=m+ ; k<=r; k++)
{
if(i>m)
{
arr[k] = buf[j++];
}
else if(j>r)
{
arr[k] = buf[i++];
arr[k].num += num;
}
else if(buf[i].data < buf[j].data)
{
arr[k] = buf[i++];
arr[k].num += num;
}
else
{
arr[k] = buf[j++];
num++;
}
}
} int main()
{
int i,j,k;
int n;
scanf("%d",&n);
Node *arr = (Node *)malloc(sizeof(Node)*(n+));
buf = (Node *)malloc(sizeof(Node)*(n+));
for(i=;i<=n;i++)
{
scanf("%d",&arr[i].data);
arr[i].pos = i;
arr[i].num = ;
}
mergesort(arr,,n);
for(i=;i<=n;i++)
{
if(i==)
printf("%d",arr[i].num+arr[i].pos-min(arr[i].data,arr[i].pos));
else
printf(" %d",arr[i].num+arr[i].pos-min(arr[i].data,arr[i].pos));
}
printf("\n"); free(arr);
free(buf);
return ;
}

最新文章

  1. 微信小程序体验(2):驴妈妈景区门票即买即游
  2. Xcode 8 日志输出乱码问题
  3. 淘宝购物车页面 PC端和移动端实战
  4. 如何用Python输出PPT中的文字信息
  5. CPU工作状态的知识介绍
  6. angularjs 指令(directive)详解(1)
  7. 补丁vs错误(codevs 2218 错误答案)
  8. [svn] linux 下svn服务器的搭建
  9. TMsgThread, TCommThread -- 在delphi线程中实现消息循环
  10. 10款很好用的 jQuery 图片滚动插件
  11. Android RelativeLayout
  12. 【产品体验】ONE一个
  13. 如何构建高性能web网站:分布式缓存
  14. textContent、innerHTML、innerText、outerText、outerHTML、nodeValue使用场景和区别
  15. maven配置及IDEA配置maven环境
  16. boostrap 日期插件(带中文显示)
  17. 【SpringMVC学习07】SpringMVC中的统一异常处理
  18. Android.Study.Question
  19. Docker 使用入门,创建一个Nginx服务器
  20. (FFT)A+B Problem

热门文章

  1. SaaS模式实现架构
  2. dbca 快速健建库
  3. EF各版本增删查改及执行Sql语句
  4. ACM学习历程—SNNUOJ1213 加油站问题(动态规划 || 数学)
  5. 控制input框输入非数字
  6. UML类图与类的关系详解【转】
  7. untra edit 显示文件函数列表
  8. Python 函数之lambda、map、filter和reduce
  9. VMware tools的使用
  10. laravel 接收json串