zoukankan      html  css  js  c++  java
  • 【BZOJ4769】超级贞鱼 归并排序求逆序对

    【BZOJ4769】超级贞鱼

    Description

    马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数。有一天,K只贞鱼兴致来潮,排成一列,从左到右第i只贞鱼会在右脚写Ai,左脚上写上i;第二年,这K只贞鱼以右脚的数为第一关键字、左脚的数为第二关键字,从小到大排成一列。然后,它们决定重编号,从左到右第i只贞鱼会在右脚上写上左脚的数,在左脚上写i;第三年,它们按第二年的方法重排列、重编号......N年后,对于从左到右第i和第j贞鱼,若i<j且第i只贞鱼右脚上的数比第j只贞鱼右脚上的数大,则称它们为一对“超级贞鱼”。问一共有多少对“超级贞鱼”?

    Input

    共3行,第一行一个正整数K,表示有K只贞鱼。
    第二行K个正整数,第i个数表示Ai。
    第三行一个非负整数N,表示年数。
    K≤2×10^6, Ai≤10^9,N≤10^18

    Output

    一个整数,表示“超级贞鱼”的对数。
     

    Sample Input

    6
    5 2 6 3 1 7
    0

    Sample Output

    7

    题解:以前刷的水题重测了一发就TLE了~

    容易发现,无论过了多少年,原序列的逆序对数都是不变的,所以直接求逆序对即可。

    但是用排序+树状数组会被卡常数,所以要用归并排序求逆序对。这个会cdq分治的都应该会吧?

    在solve(l,r)时,先solve(l,mid)和(mid+1,r),这样两边就都排好序了,就只需要统计左边和右边产生的逆序对数,用两个指针在左右两边扫一下并统计答案即可。

     

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    inline char nc(){
        static char buf[100000],*p1=buf,*p2=buf;
        return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
    }
    inline int rd(){
        char ch=nc();int sum=0;
        while(!(ch>='0'&&ch<='9'))ch=nc();
        while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
        return sum;
    }
    int n,v[2000010],p[2000010];
    ll ans;
    void solve(int l,int r)
    {
    	if(l==r)	return ;
    	int mid=(l+r)>>1,i=l,h1=l,h2=mid+1;
    	solve(l,mid),solve(mid+1,r);
    	for(i=l;i<=r;i++)
    	{
    		if(h1<=mid&&(h2>r||v[h1]<=v[h2]))	ans+=h2-mid-1,p[i]=v[h1++];
    		else	p[i]=v[h2++];
    	}
    	for(i=l;i<=r;i++)	v[i]=p[i];
    }
    int main()
    {
    	n=rd();
    	int i;
    	for(i=1;i<=n;i++)	v[i]=rd();
    	solve(1,n);
    	printf("%lld",ans);
    	return 0;
    }
  • 相关阅读:
    云图说 | GPU共享型AI容器,让AI开发更普及
    手把手带你写Node.JS版本小游戏
    一个银行客户经理的“变形记”
    大厂运维必备技能:PB级数据仓库性能调优
    软件工程开发之道:了解能力和复杂度是前提
    大数据管理:构建数据自己的“独门独院”
    结构体与共用体05 零基础入门学习C语言57
    结构体与共用体04 零基础入门学习C语言56
    PE格式详细讲解1 系统篇01|解密系列
    初步认识PE格式 基础篇06|解密系列
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/7500243.html
Copyright © 2011-2022 走看看