c++ - sigsegv 使用 vector STL

标签 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。每当我使用 vector 时,我都会在 spoj 上遇到类似的错误,但它在我的 gcc 上运行良好。

最佳答案

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

  • 您的算法复杂度为 4000 * 4000 * log(4000^2),这太慢了。试着想出一个更好(更快)的解决方案。事实上你的思考方向是正确的,只是尽量避免对数。
  • long 和 int 在大多数现代判断机器上是相同的。我从不在竞争性编程中使用 long。当你需要输入 bigger 然后 int 使用 "long long"
  • 在这种情况下,可以分别使用来自 A 和 B 的多于一对值来实现值 a + b 的给定总和。

关于c++ - sigsegv 使用 vector STL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9412006/

相关文章:

c++ - 连接两个字符串

c++ - 逐行读取文件

c++ - QTWidgets QTableWidget 因段错误而崩溃

c++ - 在模板类之外定义友元函数的正确方法是什么?

c++ - 使程序在 "machine byte"中具有不同位数的机器之间可移植

c++ - 类定义不正确。需要标识符

c++ - 如何 Hook AllocMem()、FreeMem() 等...调用?它可以是任何类型的技术 dll、可执行文件等

c++ - 如何从可变参数宏正确调用可变参数模板函数?

c++ - 使用 boost 检查端口可用性

C++ 游戏 - 发出父类信号,循环依赖问题