hdu 1394

hdu 1394

大家好,又见面了,我是全栈君。

1A…火车上写的,,。

学到:
1、明白特征。分类讨论。能够防止计数反复

求逆序数的时候,算出以每一个数为逆序数对的第二个数的情况之和即为序列的逆序数,这样能够防止反复

2、假设没有思路。就先从若干情况入手,自己模拟试试。找规律

这道题的规律就是,如果全部比x[i]小的数个数为c,那么当把第一个数移到序列最后,产生的新的逆序对个数为sum=sum-c+n-1-c;,降低了c,添加了n-1-c

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

#define lson(i) l,mid,(i)*2
#define rson(i) mid+1,r,((i)*2+1)
#define ll rt*2
#define rr (rt*2+1)
const int MAXN = 5000+10;
struct Node{int l,r,tot;}nodes[MAXN*4];

int x[MAXN],n,d[MAXN],y[MAXN];

void Pushup(int rt)
{
    nodes[rt].tot = nodes[ll].tot + nodes[rr].tot;
}

void build(int rt, int l, int r)
{
    nodes[rt].l=l;
    nodes[rt].r=r;
    nodes[rt].tot=0;
    if(l == r)
    {
        return;
    }
    int mid=(l+r)/2;
    build(ll,l,mid);
    build(rr,mid+1,r);
}

void Update(int rt, int p, int v)
{
    if(nodes[rt].l == nodes[rt].r)
    {
        nodes[rt].tot=1;
        return;

    }
    int mid=(nodes[rt].l+nodes[rt].r)/2;
    if(p<=mid)
    {
        Update(rt*2,p,v);
    }
    else
    {
        Update(rr,p,v);
    }
    Pushup(rt);
}

int Query(int rt, int l, int r)
{
    if(l == nodes[rt].l && r == nodes[rt].r)
    {
        return nodes[rt].tot;
    }
    int mid=(nodes[rt].l+nodes[rt].r)>>1;
    if(r<=mid)return Query(ll,l,r);
    else
    {
        if(l>mid)
        {
            return Query(rr,l,r);
        }
        else
        {
            return Query(ll,l,mid)+Query(rr,mid+1,r);
        }
    }
}

int main()
{
    freopen("hdu1394.txt","r",stdin);
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x[i]);
            x[i]+=1;
        }
        build(1,1,n);
        for(int i=1;i<=n;i++)
        {
            Update(1,x[i],1);
            d[i]=Query(1,1,x[i])-1;
        }
        int sum=0,ans=n;
        for(int i=1;i<=n;i++)
        {
            y[i]=Query(1,1,x[i])-1-d[i];//y[i] x[i]右側比之小的数个数
            sum+=(i-1-d[i]);
        }
        /////////////////////////
       /* for(int i=1;i<=n;i++)
        {
            printf("i=%d d=%d y=%d\n",i,d[i],y[i]);
        }
        printf("sum=%d\n",sum);*/
        //////////////
        int c;
        ans=sum;
        for(int i=1;i<=n;i++)
        {
            c=y[i]+d[i];
            sum=sum-c+n-1-c;
            ans=min(ans,sum);
        }
        printf("%d\n",ans);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115719.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月31日 下午2:00
下一篇 2022年1月31日 下午3:00


相关推荐

  • 图片链接如何在excel里转成图片_mdf文件怎么转成Excel

    图片链接如何在excel里转成图片_mdf文件怎么转成Excel前阵子从数据库中导出数据给业务,但是图片是个URL,业务需要在Excel中直接显示图片,因此在网上爬了很多VB脚本尝试修改,最终将Excel中的图片URL转换成了图片。VB脚本LoadImage.bas:’charsetGB2312.Excel中的图片链接转为图片文件AttributeVB_Name=”LoadImage加载图片”SubLoadImage()

    2026年2月16日
    4
  • web渗透测试学习路线[通俗易懂]

    web渗透测试学习路线[通俗易懂]web渗透学习路线文章目录*web渗透学习路线*前言一、web渗透测试是什么?二、web渗透步骤1.前期工作2.中期提高后期打牢总结前言本文整理的学习路线,清晰明了,重点分明,能快速上手实践,相信想学的同学们都能轻松学完。都是干货啦,先收藏⭐再看吧。本文偏基础能让萌新们快速摸到渗透测试的门道,少走弯路,也能让正在学习的小伙伴们查漏补缺,也欢迎大佬们在评论区指正错误~这里附上我之前学习的路线图提示:以下是本篇文章正文内容,下面案例可供参考一、web渗透测试是什么?Web渗透测试分为白盒测

    2022年6月23日
    42
  • linux文件夹权限777怎么设置,Linux:设置文件夹权限之777的含义[通俗易懂]

    linux文件夹权限777怎么设置,Linux:设置文件夹权限之777的含义[通俗易懂]今天面试的时候一不小心就给自己挖坑了,说使用过的Linux命令时,我说了一个mkdir-m777文件夹名称——创建文件夹及授予权限,然后就被问:为什么mkdir-m777文件夹名称授予文件夹权限要用777?在linux系统中,文件或目录的权限可以分为3种:R:4可读W:2可写X:1执行-:对应数值0数字4、2和1表示读、写、执行权限rwx=4+2+1…

    2022年10月21日
    5
  • 集群和负载均衡_分布式负载均衡

    集群和负载均衡_分布式负载均衡基于集群的动态反馈负载均衡策略基于动态反馈机制的集群负载均衡算法研究目前应用最为广泛的集群计算技术主要分为三大类:高可用性集群技术、高性能计算集群技术和负载均衡集群技术。德国的CarlAdamPetri于1962年在他的博士论文《自动机通信》中提出了Petri网的概念,它是一种适合于描述异步、并发、分布式系统的图形数学工具。动态WRR调度算法…

    2022年10月13日
    4
  • 单线,双线,三线与BGP的区别

    单线,双线,三线与BGP的区别什么是服务器 服务器主要的作用就是为了满足信息的交互 任何需要访客能访问到的游戏 网站的话 都是需要依靠在服务器上搭建实现 高防服务器的作用就是用来防止来自其他人或者黑客的恶意攻击 不然攻击中断你的业务 游戏网站等业务能够运行 都是需要通过在服务器上搭建进行使用 我们在市场上挑选服务器时 常会看到单线 双线 三线 BGP 等字样的机器 这些机器都是什么区别呢 线路 单线 单电信 单联通 单移动 双线 一个电信 IP 一个联通 IP 三线 一个电信 IP 一个联通 IP 一个移动 IP 与 BGP 单 IP 多线路电信

    2026年3月18日
    1
  • matlab 求矩阵秩,用MATLAB编程求矩阵的秩

    matlab 求矩阵秩,用MATLAB编程求矩阵的秩fori=n:-1:1我明白了,就是极大无关组,我的这个程序把所有的基都写出来了,你只要选一个就可以,还对两种矩形的矩阵(例如2×3,3×2都测试了);如果谁会优化这个程序的会更好!代码如下:ji.m%A=[17241815%23571416%46132022%812264044]A=[1,0,1,2;2,0,2,4;1,-1,1,1…

    2022年5月7日
    74

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号