[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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值