HDU1394 Minimum Inversion Number 逆序数- 线段树单点更新求

来源:互联网 发布:传奇3物品数据库 编辑:程序博客网 时间:2024/05/22 06:09

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394


题目大意:给出一个长度为n的序列,序列中元素的值包含0到n-1,我们把第一个元素移到最后面,其他元素位置不变,得到一个新的序列,这样我们一个可以得到n个不同的序列,找出这n个序列中最小的逆序数。


分析:比HDU2689多了一步,我们在找出第一个序列的逆序数之后,如果把第一个元素a[0]移到最后面,那么这个新序列的逆序数会减少a[0]个(因为一共有a[0]个数小于a[0]),不过同时,会有n-1-a[0]个数大于a[0],所以逆序数又增加了n-1-a[0]个,加起来就是,对于每一次换换,新的逆序数ans=ans-a[0]+n-1-a[0]。这样我们遍历一遍原序列,就能找出最小的逆序数了。


实现代码如下:

#include <iostream>#include <cstdio>using namespace std;const int maxn=5005;struct segment{    int l,r;    int num;}tree[maxn<<2];void build(int root,int l,int r){    tree[root].l=l;    tree[root].r=r;    tree[root].num=0;    if(l==r) return ;    int mid=(l+r)>>1;    build(root<<1,l,mid);    build(root<<1|1,mid+1,r);}void update(int root,int v){    if(tree[root].l==v&&tree[root].r==v)    {        tree[root].num=1;        return ;    }    int mid=(tree[root].l+tree[root].r)>>1;    if(v<=mid) update(root<<1,v);    else update(root<<1|1,v);    tree[root].num=tree[root<<1].num+tree[root<<1|1].num;}int query(int root,int l,int r){    if(l<=tree[root].l&&r>=tree[root].r)      return tree[root].num;    int mid=(tree[root].l+tree[root].r)>>1;    int sum1=0,sum2=0;    if(l<=mid) sum1=query(root<<1,l,r);    if(r>mid) sum2=query(root<<1|1,l,r);    return sum1+sum2;}int main(){    int n,a[maxn];    while(scanf("%d",&n)!=-1)    {        build(1,0,n-1);        int ans=0;        for(int i=0;i<n;i++)        {            scanf("%d",&a[i]);            ans+=query(1,a[i]+1,n-1);            update(1,a[i]);        }        int mini=ans;        for(int i=0;i<n;i++)        {            ans=ans-a[i]+n-1-a[i];            if(ans<mini) mini=ans;        }        printf("%d\n",mini);    }    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 老婆要跟我离婚怎么办 眼睛里进了沙子怎么办 耳塞孔进沙子了怎么办 斜挎包链子长了怎么办 爱上大15岁大叔怎么办 老板不给发工资怎么办 4个月婴儿感冒了怎么办 9个月宝宝感冒了怎么办 婆婆去世了我该怎么办 腰疼得睡不着觉怎么办 长期抱孩子腰疼怎么办 抱孩子累的腰疼怎么办 带孩子带的腰疼怎么办 生完孩子后便秘怎么办 生完宝宝下面松怎么办 坐完月子后腰疼怎么办 生完宝宝腰疼怎么办 生完小孩后腰痛怎么办 生完小孩痔疮痛怎么办 生完孩子阴松弛怎么办 生完孩子乳房松弛怎么办 生完宝宝后腰痛怎么办 顺产的过程很疼怎么办 生完孩子想离婚怎么办 刨腹产后胃胀气怎么办 月子里宝宝涨肚怎么办 肠鸣放屁多便秘怎么办 趴着睡觉胃胀气怎么办 备孕三个月了还是没怀上怎么办 月子里喂奶腰疼怎么办 生完孩子子宫疼怎么办 记账凭证写错了怎么办 饥荒精神值为0怎么办 抓不住温暖我能怎么办 父亲打母亲我该怎么办 父亲对母亲家暴怎么办 摊上家暴的父亲怎么办 家暴警察不处理怎么办 父亲把母亲打了怎么办 u盘的文件打不开怎么办 头撞墙起包了怎么办