hdu 1394 线段树之四

来源:互联网 发布:俄航中转莫斯科 知乎 编辑:程序博客网 时间:2024/05/20 11:49

求逆序对:一开始不会。。。。开了题解,wa了几次。

View Code

Problem : 1394 ( Minimum Inversion Number )     Judge Status : Accepted
RunId : 11292057    Language : G++    Author : lihaozhuzhuxia
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include <cstdio>#include <iostream>#include <cstring>using namespace std;struct p{    int r;    int l;    int sum;}tree[22222];void construct(int n,int l,int r){    tree[n].l=l;    tree[n].r=r;    tree[n].sum=0;    if(l==r)    return;    int mid=(tree[n].l+tree[n].r)/2;    construct(n*2,l,mid);    construct(n*2+1,mid+1,r);}void change(int n,int k){    int mid=(tree[n].l+tree[n].r)/2;    tree[n].sum++;    if(tree[n].l==tree[n].r)    return;    if(k<=mid)    {        change(n*2,k);    }    else    {        change(n*2+1,k);    }}int query(int n,int l,int r){    int mid=(tree[n].r+tree[n].l)/2;    if(tree[n].l==l&&tree[n].r==r)    return tree[n].sum;    if(r<=mid)    {        return query(n*2,l,r);    }    else if(l>mid)    {        return query(n*2+1,l,r);    }    else    {        return query(n*2,l,mid)+query(n*2+1,mid+1,r);    }}int a[5555];int main(){    int i,j,k,l,m,n;    while(scanf("%d",&n)==1)    {        construct(1,0,n-1);        int sum=0;        for(i=0;i<n;i++)        {            scanf("%d",&a[i]);            sum+=query(1,a[i],n-1);            change(1,a[i]);        }        int ret=sum;        for(i=0;i<n;i++)        {            sum=sum-a[i]+n-a[i]-1;            ret=min(ret,sum);        }        printf("%d\n",ret);    }    return 0;}

0 0