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. Vue SPA 首屏加载优化实践

    写在前面 本文记录笔者在Vue SPA项目首屏加载优化过程中遇到的一些坑及优化方案! 我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui ...

  2. php文件上传——php经典实例

     php文件上传——php经典实例 表单页 <html> <head> <title>文件上传</title> <meta charset='ut ...

  3. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  4. 去除\ufeff的解决方法,python语言

    语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现  \ ...

  5. Gradient-Based Learning Applied to Document Recognition 部分阅读

    卷积网络        卷积网络用三种结构来确保移位.尺度和旋转不变:局部感知野.权值共享和时间或空间降采样.典型的leNet-5如下图所示: C1中每个特征图的每个单元和输入的25个点相连,这个5* ...

  6. 全连通图求最小生成树边权之积(邻接矩阵/prim/kruskal)

    Description 大家都知道最小生成树一般求的是构成最小生成树的边的权值之和. 现在请求构成最小生成树的边的权值之积 S,最终结果请输出 (S % 100003). P.S. 点之间的边为无向边 ...

  7. 【C#日期系列(一)】--C#获取某月第一天0分0秒以及最后一天59分59秒

    工作中可能会遇到很多不常见的需求,比如这次需要获取某个月的第一天和最后一天 #region 取得某月的第一天0分0秒 /// <summary> /// 取得某月的第一天0分0秒 /// ...

  8. jquery validate表单验证插件的基本使用方法及功能拓展

    1 表单验证的准备工作 在开启长篇大论之前,首先将表单验证的效果展示给大家.    1.点击表单项,显示帮助提示 2.鼠标离开表单项时,开始校验元素 3.鼠标离开后的正确.错误提示及鼠标移入时的帮助提 ...

  9. 【LOJ】 #2009. 「SCOI2015」小凸玩密室

    题解 神仙dp啊QAQ 我们发现我们需要枚举一个起点,遍历完它所有的儿子然后向上爬 设\(f[i][j]\)表示第i个点的子树全部处理完之后到达i深度为j的祖先的兄弟处 我们只需要对叶子节点和只有一个 ...

  10. loadrunner可用许可证

    global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGIweb-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGBglobal-10 ...