[USACO18OPEN] Out of Sorts G

题目描述:

双向冒泡,问几次能够排好

题目分析:

先把数组排序,对于每个位置,求一下排完序后有多少个数不在前i个了
取Max即为答案
为什么呢
冒泡排序就是交换
对于(i-i+1)这个分割线,我们每一次冒泡会让一个不属于前面的到后面去,同时让一个不属于后面的到前面来,每一次能够让这个数-1,那么取Max即为答案

题目链接:

BZOJ 4375
Luogu 4375

Ac 代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define lowbit(x) ((x&(-x)))
const int maxm=110000; 
struct node{
    int val,id;
}a[maxm];
int sum[maxm],n;
inline bool comp(node x,node y)
{
    return x.val<y.val;
}
inline void ins(int x)
{
    for(int i=x;i<=maxm;i+=lowbit(i))
     sum[i]++;
}
inline int ask(int x)
{
    int res=0;
    for(int i=x;i;i-=lowbit(i))
     res+=sum[i];
    return res;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     scanf("%d",&a[i].val),a[i].id=i;
    std::sort(a+1,a+n+1,comp);
    int ans=0;
    for(int i=1;i<=n;i++) 
    {
        ins(a[i].id);
        ans=std::max(ans,i-ask(i));
    }
    printf("%d\n",std::max(ans,1));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35914587/article/details/80215725
今日推荐