传送门

 

参考资料:

  [1]:https://www.cnblogs.com/Miracevin/p/9662350.html

  [2]:https://blog.csdn.net/lengxuenong/article/details/80482202?utm_source=blogxgwz1

  今天已经理解了一晚上了,还是处于懵懵懂懂的状态,明天在肝一天,一定要将自己理解的题解写出来,哇咔咔!

 

题解

  定义数组 a;

  先将含有 n 个元素的数组 a 离散化,则离散化后的 n 个元素对应 1~n 的某个排列,而我们所要求的就是将离散化后的排列变为 1,2,3,...,n 所需的循环次数

  对于位置 i ,在这个双向排序过程中,每次 while( ) 循环会把一个 i 之前的大于 i 的数移到 i 后面,并且把一个 i 之后小于 i 的数移到 i 的前面

  for : i  1 to N

    我们可以对于所有的位置 i ,找到[1,i]范围内比 i 小的数的个数 s,i-s 就是 i 位置把小于 i 的放在 i 位置前面,大于 i 的放在 i 位置后面的循环次数。

对红色字体的理解

  冒泡排序,通过交换相邻两数最终使得数组有序;

  对于每个位置 i ,如果比 i 大的数都交换到 i 位置之后,比 i 小的数都交换到 i 位置之前;

  那么,等结束最后一个 i 位置的时候,冒泡排序也就结束了,此时数组也就是有序的。

  因此,对于此题的双向循环,每次判断当前位置 i 需要通过多少次while( )循环才能使得:

  比 i 大的数都交换到 i 位置之后,比 i 小的数都交换到 i 位置之前;

  因此,只需要求出 [1,i] 位置上比 i 大的数的个数,输出最大的那个即是答案;

•Code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define lowbit(x) (x&(-x))
 4 const int maxn=1e5+50;
 5 
 6 int n;
 7 struct Node
 8 {
 9     int val;
10     int id;
11     int newVal;
12 }a[maxn];
13 //==================BIT=====================
14 int bit[maxn];
15 void Add(int x)
16 {
17     while(x <= n)
18     {
19         bit[x]++;
20         x += lowbit(x);
21     }
22 }
23 int Sum(int x)
24 {
25     int sum=0;
26     while(x > 0)
27     {
28         sum += bit[x];
29         x -= lowbit(x);
30     }
31     return sum;
32 }
33 //=======================================
34 bool cmp(Node _a,Node _b) {//注意,如果val相同,初始编号 id 小的在前
35     return _a.val < _b.val || (_a.val == _b.val && _a.id < _b.id);
36 }
37 bool cmp1(Node _a,Node _b){//将数组恢复到刚开始输入时的状态
38     return _a.id < _b.id;
39 }
40 void Solve()
41 {
42     sort(a+1,a+n+1,cmp);//离散化
43     for(int i=1;i <= n;++i)
44         a[i].newVal=i;//存储离散化后的值
45     sort(a+1,a+n+1,cmp1);
46     int res=1;
47     for(int i=1;i <= n;++i)
48     {
49         Add(a[i].newVal);
50         res=max(res,i-Sum(i));//询问每个位置,找到所需的最大的循环次数
51     }
52     printf("%d\n",res);
53 }
54 int main()
55 {
56     scanf("%d",&n);
57     for(int i=1;i <= n;++i)
58         scanf("%d",&a[i].val),a[i].id=i;
59     Solve();
60 }
View Code

相关文章: