给定一段冒泡排序的代码,要求输出每个数字能到达的最右边的位置和最左边的位置的差

因为那段冒泡排序的代码是每次选取一个最小的数,放在左边的,所以,每个数最多能到达右边的位置应该是起始位置i+右边有多少个数比它大。

它能到达的最左的位置,可以这样考虑

1、它本来应该是排去起始位置的左边的,就是它本来是一个小的数字,起始位置在末尾这种情况的话。最左边的值就是a[i]

2、它是去右边的,那么最左边的值就是起始位置,

两种取max就去可以了

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
typedef unsigned long long int ULL;
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = +;
int a[maxn];
int c[maxn];
int n;
int dpR_min[maxn];
int ans[maxn];
int pos[maxn];
int f;
int lowbit (int x)//得到x二进制末尾0的个数的2次方 2^num
{
return x&(-x);
}
void add (int pos,int val)//在第pos位加上val这个值
{
while (pos<=n) //n是元素的个数
{
c[pos] += val; pos += lowbit(pos);
}
return ;
}
int get_sum (int pos) //求解:1--pos的总和
{
int ans = ;
while (pos)
{
ans += c[pos]; pos -= lowbit(pos);
}
return ans;
} void work ()
{
scanf("%d",&n);
for (int i=; i<=n; ++i)
{
scanf("%d",&a[i]);
pos[a[i]]=i;
}
memset(c,,sizeof c);
for (int i=n; i>=; --i)
{
dpR_min[i] = get_sum(a[i]-);
add(a[i],);
}
for (int i=;i<=n;++i)
{
int end = pos[a[i]] + dpR_min[pos[a[i]]];//看看它最右能去哪里
//如果这个数字是要去右边
int tR = end - pos[a[i]];
//去左边
int tL = end - a[i];
ans[a[i]] = max(tR,tL);
}
printf ("Case #%d:",++f);
for (int i=;i<=n;++i)
{
printf (" %d",ans[i]);
}
printf ("\n");
} int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf("%d",&t);
while (t--) work();
return ;
}

题目要看懂。。题目看得我头疼

最新文章

  1. DFD
  2. Android之Handler
  3. c++ 接口继承和实现继承
  4. HDU 1428 漫步校园(记忆化搜索,BFS, DFS)
  5. LeetCode_Unique Paths
  6. Swift - 使用Media Player播放本地视频,在线视频
  7. Merge Into 用法
  8. CSS(二) 颜色 盒模型 文字相关 border
  9. 紧急求助!配置SMTP插件出错,SMTP connect() failed
  10. 新概念英语(1-9)How is Ema?
  11. Vue生命周期-手动挂载理解
  12. 【译文】CSS技术:如何正确的塑造button样式!
  13. 如何高效的学习WEB前端
  14. 工具(5): 极简开发文档编写(How-to)
  15. web socket server code, 调用 shell exec child_process
  16. Dynamic CRM 2015学习笔记(5)CRM 2015 导入 OData Query Designer 解决方案
  17. ethereum/EIPs-1193 Ethereum Provider JavaScript API 如metamask更新后的接口
  18. word文档里打不开公式 打开后都是方框
  19. hdu3377
  20. Codeforces500C(SummerTrainingDay01-G)

热门文章

  1. Poj 3356 ACGT(LCS 或 带备忘的递归)
  2. 移植完linux-3.4.2内核,启动系统后使用命令ifconfig -a查看网络配置,没有eth0
  3. mariadb的读写分离
  4. hibernate 持久化对象的生命周期
  5. delphi 线程教学第二节:在线程时空中操作界面(UI)
  6. 学习Web前端的好网站推荐
  7. JavaScript代码存放位置
  8. 树莓派 Learning 002 装机后的必要操作 --- 01 解决上网问题
  9. hbase-0.98.1-cdh5.1.0 完全分布式搭建
  10. R: factor &amp; list 生成和操作因子、列表