欢迎光临
我们一直在努力

CF1500A Going Home

先考虑n^{2}的做法,两层循环分别枚举a[x]和a[y],再建立一个结构体数组id[x]={idx,idy};表示和为x的两个下标分别是idx和idy,在循环中你会收到一个和,你只需要判断id[x]是否有值,你可以用一个bool类型的数组sum[x]来存储,具体代码如下(挺好理解的):

#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5;
int n,a[N];
bool mp[N];
struct node{
int x,y;
};
node id[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int sum=a[i]+a[j];
if(mp[sum]==1){
int idx=id[sum].x;
int idy=id[sum].y;
if(i!=idx&&i!=idy&&j!=idx&&j!=idy&&idx!=idy){
cout<<"YES\\n"<<i<<' '<<j<<' '<<idx<<' '<<idy;
return 0;
}
}
mp[sum]=1;
id[sum]={i,j};
}
}
cout<<"NO";
return 0;
}

然后我们绞尽脑汁发现无法战胜,于是观察题面(以为读错题了),观察到a[i]的值域为2.5e6,那么能凑出来的和最多有多少个呢?也就是2.5e6个数分别是1~2.5e6,两两匹配最多出来2*2.5e6也就是5e6个数,也就是我们n^{2}枚举的2e5^{2}的平方个数中有大量的重复,所以我们只需要枚举不重复的5e6个数就行,所以n^{2}就是正解(什么鬼?),上边给出的代码就可以通过题目(求赞)。

赞(0)
未经允许不得转载:171主机测评 » CF1500A Going Home
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址