读书人

Time Limit Exceed

发布时间: 2012-04-11 17:42:33 作者: rapoo

Time Limit Exceed求助
http://acm.scs.bupt.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=67
上边链接是题目

以下是超时代码,能给改改不?要不给个不超时的?
#include <iostream>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
int n;
vector<double> v;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
double x,y;
cin>>x;
if(x==1)
{
cin>>y;
v.push_back(y);
}
else
{
sort(v.begin(),v.end());
if(v.size()%2==1)
{
int p=(v.size()-1)/2;
printf("%.1f",v[p]);//长度为基数
printf("\n");

}
else
{
int m=v.size()/2;
int l=m-1;
double u=(v[m]+v[l])/2;
cout.precision(1);
printf("%.1f",u);
printf("\n");
}
}
}
}
return 0;
}

[解决办法]
在世界中心呼唤爱
数据结构题,用二叉排序树水过…标准做法是用线段树,推荐下官方解题报告的简便做法。
此段摘自官方解题报告:
假设我们现在有两个集合,集合 1 存放当前数中较小的一半,集合 2 中存放当前数中较大的一半,如果集合中数的个数是奇数,那么把中位数单独列出来,记为mid。
我们记录集合 1 中的最大元素是 lmax , 集合 2 中的最小元素是 rmin
先看查询操作:如果集合有奇数个数,中位数就是 mid。如果集合有偶数个数,中位数等于(lmax+rmin)/2。
插入操作:分两种情况
(1).当前集合中有偶数个元素。
如果有 lmax <= x <= rmin,显然 mid=x 即可。
如果有 lmax > x , 显然 mid = lmax , 把 lmax 从集合 1 删除,x 插入集合 1
如果有 rmin < x , 显然 mid = rmin , 把 rmin 从集合 2 删除,x 插入集合 2
(2).当前集合中有奇数数个元素
如果 x >= mid ,那么把 mid 插入集合 1,x 插入集合 2
如果 x < mid ,那么把 mid 插入集合 2,x 插入集合 1
可以看到,上面的操作中涉及到对取出集合中的最大或最小元素,由于 n 很大,需要比较快的取得最大和最小数,因此需要堆来支持这些操作。把集合 1 设置成大根堆,集合 2 设置成小根堆,这样取元素,删除,插入的操作都是 logn,总的复杂度是 o(nlogn)

读书人网 >C++

热点推荐