使用矢量stl的sigsegv

时间:2012-02-23 11:19:53

标签: c++

#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
int main()
{
  vector<int> a, b,c,d;
  vector<long> Left, Right;
  freopen("input", "r",stdin);
  int n;
  scanf("%d",&n);
  for(int i=0;i<n;i++) {
    long a1, b1, c1, d1;
    scanf("%ld %ld %ld %ld",&a1,&b1,&c1,&d1);
    a.push_back(a1);
    b.push_back(b1);
    c.push_back(c1);
    d.push_back(d1);
  }
  int len=0;
  for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    {
      long x,y;
      x=(a[i]+b[j]);
      y=(c[i]+d[j]);
      Left.push_back(x);
      Right.push_back(-y);
      len++;
    }
  sort(Left.begin(), Left.end());
  int count=0;
  for(int i=0;i<len;i++)
  {
    long val=Right[i];
    if(binary_search(Left.begin(), Left.end(), val))
      count++;
  }
  printf("%d\n",count);
  return 0;
}  

我再次获得该计划的sigsegv。每当我使用向量时,我在spoj上得到类似的错误,但它在我的gcc上工作正常。

1 个答案:

答案 0 :(得分:1)

你应该删除freopen,否则你永远不会读取他们的输入。当我删除它时,我的代码收到了错误的答案,这是有原因的。请阅读以下提示:

  • 算法的复杂程度为4000 * 4000 * log(4000 ^ 2),这太慢了。试着想一个更好的(更快的解决方案)。事实上,你正在思考正确的方向,只是尽量避免使用对数。
  • long和int在大多数现代裁判机器上是相同的。我从不在竞争性编程中长期使用。当你需要更大的类型然后int使用“long long”
  • 可能是这样的情况:使用A和B中的多对一对值可以实现给定的a + b值。