所以我在网上判断时提交了这段代码,而代码在我的系统上运行正常,它给了我在线评判相同输入的错误。
GDB trace:
Reading symbols from solution...done.
[New LWP 4622]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 std::_Vector_base<int, std::allocator<int> >::_Vector_impl::_Vector_impl (
this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:89
89 : _Tp_alloc_type(), _M_start(), _M_finish(), _M_end_of_storage()
#0 std::_Vector_base<int, std::allocator<int> >::_Vector_impl::_Vector_impl (
this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:89
#1 std::_Vector_base<int, std::allocator<int> >::_Vector_base (
this=0x7ffe815275a0) at /usr/include/c++/7/bits/stl_vector.h:127
#2 std::vector<int, std::allocator<int> >::vector (this=0x7ffe815275a0)
at /usr/include/c++/7/bits/stl_vector.h:263
#3 main () at solution.cc:8
由于比赛现场直播,我不确定是否要分享我的代码,但如果有人对这个错误有所了解,那将会非常有帮助。
请注意,错误是由Cpp 14上完全相同的输入引起的。
好的,所以我决定分享我的代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n],b[n];
int max=1000000;
vector<int> c1[max+1],c2[max+1];
for(int i=0;i<n;i++){
cin>>a[i];
c1[a[i]].push_back(a[i]);
}
for(int i=0;i<n;i++){
cin>>b[i];
c2[b[i]].push_back(b[i]);
}
for(int i=max;i>=1;i--){
//cout<<i<<endl;
int f1=0,f2=0;
for(int j=i;j<=max;j+=i){
if(c1[j].size()>0){
f1=1;
break;
}
}
for(int j=i;j<=max;j+=i){
if(c2[j].size()>0){
f2=1;
break;
}
}
if(f1 && f2){
int max1=0,max2=0;
for(int j=i;j<=max;j+=i){
if(c1[j].size()){
for(int k=0;k<c1[j].size();k++){
if(max1<c1[j][k])
max1=c1[j][k];
}
}
}
for(int j=i;j<=max;j+=i){
if(c2[j].size()){
for(int k=0;k<c2[j].size();k++){
if(max2<c2[j][k])
max2=c2[j][k];
}
}
}
cout<<max1+max2;
return 0;
}
}
}
由于这是低估的,我只是想知道为什么?我怎么能更好地问这个问题呢?
答案 0 :(得分:0)
我怀疑你的筹码空间不足 - 坚持vector
(可变长度数组是非标准数据。不要使用它们。)
更改声明应该足够了:
vector<int> a(n),b(n);
int max=1000000;
vector<vector<int>> c1(max+1), c2(max+1);
答案 1 :(得分:0)
如果要声明一个向量数组,我建议使用数组容器类。您唯一需要记住的是,max
需要const
才能实现此目的。
const int max = 1000000;
std::array<std::vector<int, max + 1> c1, c2;
我更喜欢这种解决方案而不是矢量的“经典”矢量,在任何情况下,数组的大小在编译时都是已知的,因为眼睛上的IMO更容易。
答案 2 :(得分:0)
堆栈跟踪将代码留在第8行,这样就是第一个看起来的位置:
vector<int> c1[max+1],c2[max+1];
鉴于max
是1000000,您尝试在本地存储中创建两百万个和两个向量。它失败并不奇怪 - 大多数实现使用堆栈进行本地存储,具有合理的最大大小。您希望使用new
或(更好)std::make_unique()
创建这些内容。
至于#include <bits/stdc++.h>
和using namespace std;
- 你真的想放弃那些在一起使用时特别有害的坏习惯。