小猴和冒泡 | ||||||
| ||||||
Description | ||||||
小猴同学遇见了一道难题:给出一个长度为n的序列,将其变成递增序列。
可能对于你来说并不算难题,因为一个qsort就完全可以解决,但是对于小猴同学来说就是个难题了,因为他只会冒泡。
冒泡的思想相信大家都会,每次比较相邻两个数的大小,如果想要得到递增序列,那么前一个数大于后一个数就要把它们交换一下位置,经过n-1趟扫描就能得到想要的递增序列。
但是冒泡的时间复杂度是O(n^2),经常会超时,我们假设每作一次交换需要1ms,而小猴同学遇到的难题时间限制是1000000ms,现在请你帮助小猴同学判断一下他的冒泡算法是否会超时。
| ||||||
Input | ||||||
本题测试数据不超过200组。对于每组测试数据,第一行输入一个整数n(1<=n<=5000),表示这个序列有n个数,接下来一行有n个数,每两个数之间用空格隔开,代表给出的序列。 | ||||||
Output | ||||||
对于每组测试数据,如果小猴程序运行的时间小于难题的时间限制,则输出"xiaohouV5!",否则输出"xiaohouTLE!"。(如果小猴程序运行的时间和限制的时间相等,则判TLE)。
| ||||||
Sample Input | ||||||
4
2 1 4 3
| ||||||
Sample Output | ||||||
xiaohouV5! | ||||||
Author | ||||||
小猴 |
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int c[500003];
int n;
struct data
{
int num,pos;
} a[500003];
bool cmp(data a,data b)
{
if(a.num==b.num)
return a.pos<b.pos;
return a.num<b.num;
}
int lowbit(int x)
{
return x&(-x);
}
void updata(int x)
{
while(x<=n)
{
c[x]+=1;
x+=lowbit(x);
}
}
int getsum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int hash1[500003];
int main()
{
while(scanf("%d",&n)==1&&n)
{
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i].num);
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1; i<=n; i++)hash1[a[i].pos]=i;
long long ans=0;
memset(c,0,sizeof(c));
for(int i=1; i<=n; i++)
{
updata(hash1[i]);
ans+=i-getsum(hash1[i]);
}
if(ans< 1000000)
printf("xiaohouV5!\n");
else printf("xiaohouTLE!\n");
}
}