使用矢量STL的SIGSEGV

sigsegv using vector stl

本文关键字:SIGSEGV STL      更新时间:2023-10-16
#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("%dn",count);
  return 0;
}  

我再次为该程序获得sigsegv。每当我使用矢量时,我在 spoj 上都会收到类似的错误,但它在我的 gcc 上工作正常。

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

  • 你的算法复杂度是 4000 * 4000 * log(4000^2(,太慢了。尝试想一个更好(更快的解决方案(。事实上,您正在朝着正确的方向思考,只是尽量避免对数。
  • long和int在大多数当代裁判机器上都是相同的。我从不在竞争性编程中使用长时间。当你需要更大的类型时,int使用"long long">
  • 可能的情况是
  • ,可以分别使用 A 和 B 中的一对值来实现给定的值 A + B 的总和。