题意: 1 - N 的一个排列 进行冒泡排序 输出排序时i出现的最左位置和最右位置的差,i 为 1 - N
第K个数 出现的三个边界情况为
1.位置K
2.最右位置为 K + (K 右边比第K个数小的数的个数)
3.位置(第k个数的值)
最后取差最大的
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#define sf scanf
#define pf printf
using namespace std;
const int maxn = 100000 + 10;
int num[maxn];
int ans[maxn];
int FABS(int n){
return n > 0 ? n : -n;
}
struct BIT{
int C[maxn];
int n;
void init(int _n){
n = _n;
for(int i = 0;i <= n;++i){
C[i] = 0;
}
}
int lowbit(int x){
return x & ( -x );
}
void add(int x,int d){
while(x <= n){
C[x] += d;
x += lowbit(x);
}
}
int sum(int x){
int ret = 0;
while( x > 0 ){
ret += C[x];
x -= lowbit(x);
}
return ret;
}
}tree;
int main(){
int T,ca = 0;
sf("%d",&T);
while( T-- ){
int n;sf("%d",&n);
tree.init(n);
for(int i = 1;i <= n;++i){
sf("%d",&num[i]);
ans[i] = 0;
}
for(int i = n;i > 0;--i){
int low_cnt = tree.sum(num[i]);
int low_pos = i + low_cnt;
ans[num[i]] = max(FABS(num[i] - i) , max(FABS(num[i] - low_pos),FABS(i - low_pos)));
tree.add(num[i],1);
}
pf("Case #%d:",++ca);
for(int i = 1;i <= n;++i) pf(" %d",ans[i]);
pf("\n");
}
return 0;
}