hdu 1394 线段树求逆序数

来源:互联网 发布:2017年网络宣传周主题 编辑:程序博客网 时间:2024/06/06 18:20

http://acm.hdu.edu.cn/showproblem.php?pid=1394

#include <cstdio>using namespace std;const int maxx=5100;int sum[maxx<<2];#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1void pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l, int r, int rt){    sum[rt]=0;    if(l==r) return;    int m = (l+r)>>1;    build(lson);    build(rson);}void update(int p, int l,int r, int rt){    if(l==r)    {        sum[rt]++;        return;    }    int m = (l+r)>>1;    if(p<=m) update(p,lson);    else update(p,rson);    pushup(rt);}int query(int L, int R, int l, int r, int rt){    if(L<=l&&r<=R)        return sum[rt];    int m = (l+r)>>1;    int res=0;    if(L<=m) res+=query(L,R,lson);    if(R>m) res+=query(L,R,rson);    return res;}int a[maxx];int main(){    int n;    while(~scanf("%d",&n))    {        build(0,n-1,1);        int sum=0;        for(int i = 0; i<n; i++)        {            scanf("%d",&a[i]);            sum+=query(a[i],n-1,0,n-1,1);            update(a[i],0,n-1,1);        }        int res=sum;        for(int i = 0; i<n; i++)        {            sum+=n-a[i]-a[i]-1;            res=res<sum?res:sum;        }        printf("%d\n",res);    }}
0 0
原创粉丝点击