JZ高中OJ 1386. 排序

僤鯓⒐⒋嵵緔 提交于 2019-11-26 04:32:29

Description

  你收到一项对数组进行排序的任务,数组中是1到N个一个排列。你突然想出以下一种特别的排序方法,分为以下N个阶段:
  •阶段1,把数字1通过每次交换相邻两个数移到位置1;
  •阶段2,用同样的方法把N移到位置N;
  •阶段3,把数字2移到位置2处;
  •阶段4,把数字N-1移到位置N-1处;
  •依此类推。
  换句话说,如果当前阶段为奇数,则把最小的未操作的数移到正确位置上,如果阶段为偶数,则把最大的未操作的数移到正确位置上。
  写一个程序,给出初始的排列情况,计算每一阶段交换的次数。
 

Input

  第一行包含一个整数N(1<=N<=100000),表示数组中元素的个数。
  接下来N行每行一个整数描述初始的排列情况。

Output

  输出每一阶段的交换次数。
 

Sample Input

输入1:
3
2
1
3


输入2:
5
5
4
3
2
1

输出3:
7
5
4
3
7
1
2
6

Sample Output

输出1:
1
0
0

输出2:
4
3
2
1
0

输出3:
4
2
3
0
2
1
0
 

Data Constraint

 
 

Hint

【数据范围】
  70%的数据N<=100
 1 #include<bits/stdc++.h>
 2 #define ri register int
 3 #define il inline
 4 #define go(i,a,b) for(ri i=(a);i<=(b);++i)
 5 using namespace std;
 6 template<class T> il T read(T& a) {
 7     char c;bool f=0;
 8     for(;!isdigit(c=getchar());f|=(c=='-'));
 9     for(a=c-'0';isdigit(c=getchar());a=a*10+c-'0');
10     return a=(f?-a:a);
11 }
12 const int N=1e5+7;
13 int n,a,p[N],ans,tr[N];
14 il void add(ri x,ri f) {for(;x<=n;x+=(x&-x))tr[x]+=f;}
15 il int ask(ri x) {int r=0;for(;x;x-=(x&-x))r+=tr[x];return r;}
16 int mian() {
17     read(n);
18     go(i,1,n) p[read(a)]=i,add(i,1);
19     go(i,1,n-1) {
20         if(i&1) {
21             ri t=(i+1)>>1;
22             cout<<ask(p[t]-1)<<'\n';
23             add(p[t],-1);
24         }else {
25             ri t=n-(i>>1)+1;
26             cout<<ask(n)-ask(p[t])<<'\n';
27             add(p[t],-1);
28         }
29     }puts("0");
30     return 0;
31 }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!