集训第四周(高效算法设计)A题 Ultra-QuickSort
原题poj 2299:http://poj.org/problem?id=2299
题意,给你一个数组,去统计它们的逆序数,由于题目中说道数组最长可达五十万,那么O(n^2)的排序算法就不要再想了,归并排序~~~
这里列出归并的解法:
#include"iostream"
using namespace std; const int maxn=500000+10; int T[maxn];
int a[maxn]; long long sum; void merge_sort(int *a,int x,int y,int *T)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(a,x,m,T);
merge_sort(a,m,y,T);
while(p<m||q<y)
{
if(q>=y||(p<m&&a[p]<a[q])) T[i++]=a[p++];
else {sum+=m-p;T[i++]=a[q++];}
}
for(int i=x;i<y;i++) a[i]=T[i];
}
}
int main()
{
int n;
while(cin>>n&&n)
{
sum=0;
for(int i=0;i<n;i++) cin>>a[i];
merge_sort(a,0,n,T);
/* for(int i=0;i<n;i++) cout<<a[i]<<' ';
cout<<endl;*/
cout<<sum<<endl;
}
return 0;
} 贴出一段代码,请找出其中的错误并改正:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=5e5+;
int a[maxn],n;
int t[maxn];
long long ans;
void mergesort(int c[],int b,int e)
{
if(e-b>)
{
int p=(b+e)>>;
int mid=p,begi=b;
mergesort(c,b,p);
mergesort(c,p,e); int i=; while(mid<e||begi<p)
{
if(mid>=e||(begi<p&&(c[begi]<=c[mid]))) t[i++]=c[begi++];
else {ans+=p-begi;t[i++]=c[mid++];}
} i=;
for(int j=b;j<=e;j++) c[j]=t[i++];
}
} int main()
{
while(scanf("%d",&n),n!=)
{
for(int i=;i<=n;i++) scanf("%d",&a[i]); ans=; mergesort(a,,n+); printf("%d\n",ans); }
return ;
}
改正后:
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=5e5+;
int a[maxn],n;
int t[maxn];
long long ans;
void mergesort(int c[],int b,int e)
{
if(e-b>)
{
int p=(b+e)>>;
int mid=p,begi=b;
mergesort(c,b,p);
mergesort(c,p,e); int i=; while(mid<e||begi<p)
{
if(mid>=e||(begi<p&&(c[begi]<c[mid]))) t[i++]=c[begi++]; /*必须严格递增,等于也算是逆序数,因为a[begi]后面的数肯定都会大于a[mid]*/
else {ans+=p-begi;t[i++]=c[mid++];}
} i=;
for(int j=b;j<e;j++) c[j]=t[i++]; //j不会到e正如begi不会到mid
}
} int main()
{
while(scanf("%d",&n),n!=)
{
for(int i=;i<=n;i++) scanf("%d",&a[i]); ans=; mergesort(a,,n+); printf("%lld\n",ans); //输出长整型必须使用%lld或者%I64d }
return ;
}
集训第四周(高效算法设计)A题 Ultra-QuickSort的更多相关文章
- 集训第四周(高效算法设计)P题 (构造题)
Description There are N<tex2html_verbatim_mark> marbles, which are labeled 1, 2,..., N<te ...
- 集训第四周(高效算法设计)O题 (构造题)
A permutation on the integers from 1 to n is, simply put, a particular rearrangement of these intege ...
- 集训第四周(高效算法设计)N题 (二分查找优化题)
原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度 ...
- 集训第四周(高效算法设计)M题 (扫描法)
原题:UVA11078 题意:给你一个数组,设a[],求一个m=a[i]-a[j],m越大越好,而且i必须小于j 怎么求?排序?要求i小于j呢.枚举?只能说超时无上限.所以遍历一遍数组,设第一个被减数 ...
- 集训第四周(高效算法设计)I题 (贪心)
Description Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshe ...
- 集训第四周(高效算法设计)E题 (区间覆盖问题)
UVA10382 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21419 只能说这道题和D题是一模一样的,不过要进行转化, ...
- 集训第四周(高效算法设计)D题 (区间覆盖问题)
原题 UVA10020 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19688 经典的贪心问题,区间上贪心当然是右区间越 ...
- 集训第四周(高效算法设计)L题 (背包贪心)
Description John Doe is a famous DJ and, therefore, has the problem of optimizing the placement of ...
- 集训第四周(高效算法设计)K题 (滑窗问题)
UVA 11572 唯一的雪花 题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新 方法一: #include& ...
随机推荐
- border-radius的参数
border-radius的参数: 据w3c上的官方解释,是这样子的: border-radius: 1-4 length|% / 1-4 length|%;1-4指的是radius的四个值,leng ...
- Latex新人教程
1.LaTeX软件的安装和使用 方法A(自助):在MikTeX的官网下载免费的MikTeX编译包并安装.下载WinEdt(收费)或TexMaker(免费)等编辑界面软件并安装. 方法B(打包):在ct ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第五天(非原创)
文章大纲 一.课程介绍二.前台系统(门户系统)搭建介绍三.前台系统(门户系统)搭建实战四.js请求跨域解决五.项目源码与资料下载六.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背 ...
- AJPFX:学习JAVA程序员两个必会的冒泡和选择排序
* 数组排序(冒泡排序)* * 冒泡排序: 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处* * 选择排序 : 从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现 ...
- Spring data jpa中Query和@Query分别返回map结果集
引用: http://blog.csdn.net/yingxiake/article/details/51016234 http://blog.csdn.net/yingxiake/article/d ...
- 如何理解JavaScript的单线程
JS的本质是单线程的.这点区别于JAVA的两个线程并发 但是,平时的JS,确实是同时运行很多任务,这又是怎么回事???? First,js的代码分为两种.同步代码和异步代码. console.log( ...
- 微信小程序组件解读和分析:十、input输入框
input输入框组件说明: 本文介绍input 输入框的各种参数及特性. input输入框示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 01 02 03 04 0 ...
- java设计模式之代理模式 ,以及和java 回调机制的区别
java 代理模式就是: 将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想 ...
- Python学习 Day 8 继承 多态 Type isinstance dir __slots__
继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...
- java内存查看与分析
业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...