【发布时间】:2015-11-15 22:49:36
【问题描述】:
如何在不超过时间限制的情况下解决此问题
http://codeforces.com/problemset/problem/474/B
我尝试将所有范围放入 2D 向量中,然后使用二进制搜索查找所需的索引,但似乎 fn BS() 中的循环需要大量执行,因为向量的大小可以是 10^6。
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int Search(vector <vector<int> > a,int key){
int start = 0;
int end = a.size() - 1;
while (start <= end){
int mid = start + (end - start) / 2;
if (a[mid][0] > key && a[mid][1] > key){
end = mid - 1;
}
else if (a[mid][0] < key && a[mid][1] < key){
start = mid + 1;
}
else {
return mid;
}
}
return -1;
}
vector <int> BS(vector <vector <int> > v, vector<int> keys){
int j = 0;
vector <int> piles;
for (int i = 0; i < keys.size(); i++){
piles.push_back(Search(v, keys[i])+1);
}
return piles;
}
vector < vector<int> > Range(vector<int> v){
vector < vector<int> > ranges(v.size());
int sum1 = 1;
int sum2 = v[0];
for (int i = 0; i < v.size(); i++){
if (i == 0){
ranges[i].push_back(sum1);
ranges[i].push_back(v[i]);
sum1 += v[i];
}
else{
ranges[i].push_back(sum1);
sum2 += v[i];
ranges[i].push_back(sum2);
sum1 += v[i];
}
}
return ranges;
}
int main(){
int n, m;
cin >> n;
vector <int> a, q;
vector < vector <int> > v;
for (int i = 0; i < n; i++){
int k;
cin >> k;
a.push_back(k);
}
cin >> m;
for (int i = 0; i < m; i++){
int l;
cin >> l;
q.push_back(l);
}
v = Range(a);
vector <int> jucy = BS(v, q);
for (int i = 0; i < jucy.size(); i++){
cout << jucy[i] << endl;
}
}
【问题讨论】:
-
现在运行速度有多快?
-
当 n 接近 10^5 时,它在测试用例 3 的运行时间超过 1000 毫秒
-
在每次调用时不要不必要地复制输入向量(参数)怎么样? wtb参考。
-
尽可能减少循环使用。与其他算法相比,线性循环(while 循环和从 A 到 Z 的 for 循环)非常糟糕。如果你上一门数据结构和算法课程,你会学到这一点。
-
您使用了错误的数据结构和错误的算法。查看评分最高的答案,它使用正确的数据结构和正确的算法。