#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/