4769: 超级贞鱼

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

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

Input

一共3行,第一行一个正整数k(1≤k≤10^5),第二行k个数从左到右输入Ai(1≤Ai≤10^9),第三行一个正整数n(1≤n≤10^5)。

Output

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

Sample Input

6
5 2 6 3 1 7
0

Sample Output

7

HINT

对于全部数据:Ai≤10^9。
30%的数据:n,k<=400; 
70%的数据:n,k<=10000; 
100%的数据:n,k<=100000;
命题by benny

Source

ROJ原创

upd: 好吧,经过出题人的不懈努力,我的程序终于TLE了。。qwq

那么优化一下,听唐大爷说不论怎么变换,逆序对的数总是不变的(似乎好有道理qaq),那么离散化什么的都不需要辣,只要一次归并排序就好

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 2000100
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int a[N],tmp[N],k;
ll n,ji;
void gb(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>,cnt=l,h1=l,h2=mid+;
gb(l,mid);gb(mid+,r);
while(h1<=mid&&h2<=r)
{
while(a[h1]>a[h2])
{
tmp[cnt++]=a[h2];
h2++;
ji+=mid-h1+;
if(h2>r) break;
}
tmp[cnt++]=a[h1];
h1++;
}
for(int i=h1;i<=mid;i++) tmp[cnt++]=a[i];
for(int i=h2;i<=r;i++) tmp[cnt++]=a[i];
for(int i=l;i<=r;i++) a[i]=tmp[i];
}
int main()
{
scanf("%lld",&n);
for(int i=;i<=n;i++) a[i]=read();
k=read();gb(,n);
printf("%lld\n",ji);
}

归并排序裸题,我们会发现当重排次数 n 为偶数时,其等价于原数列,(其实就是相当于一个二元的结构体,一次按第一位排序,第二次按第二位排序),然后就是相当于求一个数列的逆序对个数

初始的时候先离散化一下就好(TLE)

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1000100
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,a[N],tmp[N],k;
ll ji;
void gb(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>,cnt=l,h1=l,h2=mid+;
gb(l,mid);
gb(mid+,r);
while(h1<=mid&&h2<=r)
{
while(a[h1]>a[h2])
{
tmp[cnt++]=a[h2];
h2++;
ji+=mid-h1+;
if(h2>r) break;
}
tmp[cnt++]=a[h1];
h1++;
}
for(int i=h1;i<=mid;i++) tmp[cnt++]=a[i];
for(int i=h2;i<=r;i++) tmp[cnt++]=a[i];
for(int i=l;i<=r;i++) a[i]=tmp[i];
}
struct qaz{int x,p;}tp[N];
bool cmp(qaz q,qaz z){if(q.x==z.x)return q.p<z.p;return q.x<z.x;}
int main()
{
n=read();
for(int i=;i<=n;i++){tp[i].x=read();tp[i].p=i;}
sort(tp+,tp+n+,cmp);
for(int i=;i<=n;i++) a[tp[i].p]=i;
k=read();
if(k&)
{
for(int i=;i<=n;i++){tp[i].x=a[i];tp[i].p=i;}
sort(tp+,tp+n+,cmp);
for(int i=;i<=n;i++) a[i]=tp[i].p;
}
gb(,n);
printf("%lld\n",ji);
}

bzoj 4769: 超级贞鱼 -- 归并排序的更多相关文章

  1. BZOJ 4769: 超级贞鱼 逆序对 + 归并排序

    手画几下序列的变换后发现逆序对数是恒定的,故只需对第 $0$ 年求逆序对即可. 树状数组会 $TLE$ 的很惨,需要用到归并排序来求逆序对. 其实就是省掉了一个离散化的时间,估计能比树状数组快一半的时 ...

  2. 【BZOJ4769】超级贞鱼 归并排序求逆序对

    [BZOJ4769]超级贞鱼 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数.有一天,K只贞鱼兴致来潮,排成一列,从左到右第i ...

  3. ROJ 1166 超级贞鱼

    1166: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB [Submit][Status] 传送门 Description 马达加斯加贞鱼是一种神奇的双脚贞 ...

  4. BZOJ5311,CF321E 贞鱼

    题意 Problem 5311. -- 贞鱼 5311: 贞鱼 Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 677  Solved: 150[Subm ...

  5. BZOJ_5311_贞鱼_决策单调性+带权二分

    BZOJ_5311_贞鱼_决策单调性+带权二分 Description 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半. 这不?他们遇到了大麻烦! n只贞鱼到陆地上乘车,现在有k辆汽 ...

  6. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  7. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  8. 贞鱼传教&&贞鱼传教(数据加强版)

    http://acm.buaa.edu.cn/problem/1381/ 贞鱼传教[问题描述] 新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教.说干就干 ...

  9. CF321E Ciel and Gondolas & BZOJ 5311 贞鱼

    一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜. 设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么 $f_{i, j} = f_{p, j ...

随机推荐

  1. VMware 克隆多台Linux机器并配置IP的方法

    我们首先要知道 VMware 三种网络模式的区别. ①.Bridged(桥接模式):就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信.在桥接的作用下,类似于把物理主机虚拟为一个交换机,所有桥接设置 ...

  2. 解读Linux命令格式(转)

    解读Linux命令格式   环境 Linux HA5-139JK 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x8 ...

  3. rabbitmq和kafka怎么选?【转】

    MQ框架非常之多,今天简单说一下有代表性的两个MQ(rabbitmq和kafka).经常会有人问rabbitmq和kafka到底哪个好呢?其实没有好与不好之分,只有哪个更合适,首先要根据自己项目的业务 ...

  4. Nginx - 隐藏或修改版本号

    1. 前言 无论是修改 Nginx 版本还是隐藏 Nginx 版本号,都是很简单的操作,对外来说,相对更安全些. 2. 修改 Nginx 版本号 对于修改 Nginx 版本号来说,需要在源码的基础上进 ...

  5. windows下安装多个mysql

    1.正常安装mysql5.1.33 安装服务名为mysql3306 安装目录d:\mysql5.1\3306 安装完成后,关闭服务 ① 复制安装文件 将默认安装目录C:\Documents and S ...

  6. 转:google测试分享-问题和挑战

    原文: http://blog.sina.com.cn/s/blog_6cf812be0102vxer.html 前言:这个系列分享的内容大部分都是出自于<google是如何测试的>的书, ...

  7. 产生唯一的临时文件mkstemp()

    INUX下建立临时的方法(函数)有很多, mktemp, tmpfile等等. 今天只推荐最安全最好用的一种: mkstemp. mkstemp (建立唯一临时文件)头文件: #include < ...

  8. POJ 2752 Seek the Name, Seek the Fame(KMP求公共前后缀)

    题目链接:http://poj.org/problem?id=2752 题目大意:给你一串字符串s找到所有的公共前后缀,即既是前缀又是后缀的子串. 解题思路: 如图所示 假设字符串pi与jq为符合条件 ...

  9. [BZOJ4945][Noi2017]游戏 2-sat

    对于所有的x,我们枚举他的地图类型,事实上我们只需要枚举前两种地形就可以覆盖所有的情况. 之后就变成了裸的2-sat问题. 对于一个限制,我们分类讨论: 1.h[u]不可选,跳过 2.h[v]不可选, ...

  10. 使用matlab表示“段数不确定”的分段函数

    示例函数: 分段函数f(x)的段数为数组a的长度减1,在表达f(x)时,不能直接使用a的长度5-1=4. 方法1: 先计算每个间隔点的函数值f(a2),f(a3),f(a4),再循环表示f(x). f ...