bzoj 4769: 超级贞鱼 -- 归并排序
4769: 超级贞鱼
Time Limit: 1 Sec Memory Limit: 128 MB
Description
Input
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
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: 超级贞鱼 -- 归并排序的更多相关文章
- BZOJ 4769: 超级贞鱼 逆序对 + 归并排序
手画几下序列的变换后发现逆序对数是恒定的,故只需对第 $0$ 年求逆序对即可. 树状数组会 $TLE$ 的很惨,需要用到归并排序来求逆序对. 其实就是省掉了一个离散化的时间,估计能比树状数组快一半的时 ...
- 【BZOJ4769】超级贞鱼 归并排序求逆序对
[BZOJ4769]超级贞鱼 Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上各有一个数.有一天,K只贞鱼兴致来潮,排成一列,从左到右第i ...
- ROJ 1166 超级贞鱼
1166: 超级贞鱼 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status] 传送门 Description 马达加斯加贞鱼是一种神奇的双脚贞 ...
- BZOJ5311,CF321E 贞鱼
题意 Problem 5311. -- 贞鱼 5311: 贞鱼 Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 677 Solved: 150[Subm ...
- BZOJ_5311_贞鱼_决策单调性+带权二分
BZOJ_5311_贞鱼_决策单调性+带权二分 Description 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半. 这不?他们遇到了大麻烦! n只贞鱼到陆地上乘车,现在有k辆汽 ...
- 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼
目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...
- 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)
[BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...
- 贞鱼传教&&贞鱼传教(数据加强版)
http://acm.buaa.edu.cn/problem/1381/ 贞鱼传教[问题描述] 新的一年到来了,贞鱼哥决定到世界各地传授“贞教”,他想让“贞教”在2016年成为世界第四大宗教.说干就干 ...
- CF321E Ciel and Gondolas & BZOJ 5311 贞鱼
一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜. 设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么 $f_{i, j} = f_{p, j ...
随机推荐
- spring mvc convention over configuration 之 RequestToViewNameTranslator
1. RequestToViewNameTranslator简介 在springmvc中很多地方都是约定优于配置的,比如这种写法: @Controller public class IndexActi ...
- FastStoneCapture(FSCapture)录屏、剪辑教程
FastStoneCapture软件编辑视频的使用方法: http://www.tudou.com/programs/view/2eD-s5HP1xw/
- Sqlmap与burpsuite动态更新某些参数
有如下注入点: http://localhost/id=1&order_nu=1 情况说明: id为注入点, 每一次注入时, order_nu不能跟上次的一样(假说这个order_nu为一个 ...
- SQLite3 使用教学
source: SQL中文站:http://www.sqlite.com.cn/MySqlite/4/378.Html OS X自从10.4后把SQLite这套相当出名的数据库软件,放进了作业系统工具 ...
- MAC和PHY的区别
一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...
- HDU 6195 2017沈阳网络赛 公式
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6195 题意:有M个格子,有K个物品.我们希望在格子与物品之间连数量尽可能少的边,使得——不论是选出M个 ...
- 5.Python3标准库-日期和时间
''' 不同于int,str,float,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值 time模块由底层C库提供与时间相关的函数.它包含 ...
- 如何删除git远程分支(转)
1,在开发过程中,大家在远程创建了许多分支,有些是无用的,该如何删除呢,可以参考下面的方法. 如果不再需要某个远程分支了,比如搞定了某个特性并把它合并进了远程的 master 分支(或任何其他存放 稳 ...
- HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...
- 基于AQS实现的Java并发工具类
本文主要介绍一下基于AQS实现的Java并发工具类的作用,然后简单谈一下该工具类的实现原理.其实都是AQS的相关知识,只不过在AQS上包装了一下而已.本文也是基于您在有AQS的相关知识基础上,进行讲解 ...