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 ...
随机推荐
- 大图片上传(ImageIO,注意有的图片不能上传时因为他是tiff格式)
一下是必要的: 1.enctype="multipart/form-data" 2. //不要使用myeclipse自动生成的get.set方法(struts2中的用法) publ ...
- xargs -i 和-I 的区别【转】
xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf * ...
- Feign 发送对象,对象含多个文件
Feign在发送文件时,可以使用Feign-form. 另一种方式,关键就是,要将文件转成Resource,然后使用Spring的MultivalueMap 本次发送的是个对象,对象里含有 文件对象数 ...
- Linux时间结构体和获得时间函数
关于Linux下时间编程的问题: 1. Linux下与时间有关的结构体 struct timeval { int tv_sec; int tv_usec; }; 其中tv_sec是由凌晨开始算起的秒数 ...
- Bootstrap开发模板
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- hdu 5468(dfs序+容斥原理)
Puzzled Elena Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 关于语义化版本(semantic versioning or SemVer)
1 为什么要有SemVer? SemVer用来规范组件之间的依赖版本,它使用一个版本号来传递出组件的API的变化情况. 在理解这规范之后,看一眼依赖包的版本号,就知道API的变化(兼容性)程度,方便 ...
- CSU 1412 Line and Circles
原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1412 题目要求判断是否有一条直线可以穿过所有的圆. 做法:把所有圆心做一次凸包,然后判断 ...
- yii2 DateTimePicker显示到天
扩展是 kartik\datetime\DateTimePicker; 关键是加入此配置 'minView'=> "month",示例如下: <?php echo D ...
- 用LR录制文件下载并随机产生文件名
用LR录制文件下载并随机产生文件名 {H.IY:X.Tn0 8h&~-D|6fV0Action()51Testing软件测试网GE$nV}s,R{51Testing软件测试网 }9sUS'q ...