原题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的更多相关文章

  1. 集训第四周(高效算法设计)P题 (构造题)

    Description   There are N<tex2html_verbatim_mark> marbles, which are labeled 1, 2,..., N<te ...

  2. 集训第四周(高效算法设计)O题 (构造题)

    A permutation on the integers from 1 to n is, simply put, a particular rearrangement of these intege ...

  3. 集训第四周(高效算法设计)N题 (二分查找优化题)

    原题:poj3061 题意:给你一个数s,再给出一个数组,要求你从中选出m个连续的数,m越小越好,且这m个数之和不小于s 这是一个二分查找优化题,那么区间是什么呢?当然是从1到数组长度了.比如数组长度 ...

  4. 集训第四周(高效算法设计)M题 (扫描法)

    原题:UVA11078 题意:给你一个数组,设a[],求一个m=a[i]-a[j],m越大越好,而且i必须小于j 怎么求?排序?要求i小于j呢.枚举?只能说超时无上限.所以遍历一遍数组,设第一个被减数 ...

  5. 集训第四周(高效算法设计)I题 (贪心)

    Description Shaass has n books. He wants to make a bookshelf for all his books. He wants the bookshe ...

  6. 集训第四周(高效算法设计)E题 (区间覆盖问题)

    UVA10382 :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21419 只能说这道题和D题是一模一样的,不过要进行转化, ...

  7. 集训第四周(高效算法设计)D题 (区间覆盖问题)

    原题 UVA10020  :http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19688 经典的贪心问题,区间上贪心当然是右区间越 ...

  8. 集训第四周(高效算法设计)L题 (背包贪心)

    Description   John Doe is a famous DJ and, therefore, has the problem of optimizing the placement of ...

  9. 集训第四周(高效算法设计)K题 (滑窗问题)

    UVA 11572 唯一的雪花 题意:给你从1到n的数组,要求求得其中的最长连续不重复子序列,经典的滑窗问题,方法是维护一个窗口,设置左框和右框,然后不断的进行维护和更新 方法一: #include& ...

随机推荐

  1. [USACO4.1]麦香牛块Beef McNuggets By cellur925

    题目描述 农夫布朗的奶牛们正在进行斗争,因为它们听说麦当劳正在考虑引进一种新产品:麦香牛块.奶牛们正在想尽一切办法让这种可怕的设想泡汤.奶牛们进行斗争的策略之一是“劣质的包装”.“看,”奶牛们说,“如 ...

  2. windows 命令行下 切换目录

    cd D:\ 没啥用,直接D:就可以切换了,D,D:\都不行

  3. 手机APP测试点总结(参考)

    参考链接:http://www.zengyuetian.com/?p=2305 手机APP测试点: 功能测试:多注意核心业务风险(如:注册.登录.付费.订单等) 兼容性测试:系统兼容性.硬件兼容性.软 ...

  4. python列表和元组的常用操作

    一.列表 需要安利一下:列表和字符串数是不一样的.进行操作时列表可以发生改变,而字符串不可以,所以直接在原来的对象上操作. 1.列表的增加 def append(self, p_object): # ...

  5. CMake学习笔记二:cmake 常用变量和常用环境变量

    1 cmake 变量引用的方式 使用 ${} 进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过 ${} 取值. 2 cmake 自定义变量的方式 主要有隐式定义和显式定义两种,举一个隐式定 ...

  6. hihoOffer收割练习20题目2

    题目2 : SCI表示法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 每一个正整数 N 都能表示成若干个连续正整数的和,例如10可以表示成1+2+3+4,15可以表示 ...

  7. Linux命令(009) -- tar

    tar命令可以为Linux的文件和目录创建档案(备份).利用该命令,可以为某一特定文件创建备份,也可以在档案中改变文件或向档案中加入新的文件:可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件 ...

  8. SQL Server Management Studio 手动导入Excel文件

    SQL Server Management Studio(企业管理器) 手动导入Excel文件,有时间还是非常方便的,省去了写代码的麻烦. 具体步骤如下: 下面附上 创建游标的方法(用于循环读取临时表 ...

  9. mysql之流程控制

    目录 分支结构 循环结构 分支结构: 1.if condition then [statement] elseif condition then [statement] else [statement ...

  10. 跨库导表数据(sql)

    程序员用 列子: insert into "000".tbFreeReportselect ReportCode ,ReportName ,GroupNamefrom openda ...