Codeforces Round #486 (Div. 3) C "Equal Sums" (map+pair<>)

传送门

•题意

给k个数列,从中k个数列中找出任意2个数列 i ,j

使得数列i删除第x个数,和数列j删除第y个数的和相等

若存在,输出 i ,x 和 j,y 

•思路

每个数列之间的联系为数列的和之间的差det

如果开二维数组记录每个数列之间的det的话,显然是不可行的_(:з」∠)_

这里用map<x ,pair<i ,j > >mp表示序列 i 删除第 j 个数后的总和为 x;

如果某两个序列各删除一个数,得到的总和相等,

也就是后一个序列得到的总和已存在(被前一个所记录)的话,就找到了

•代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn=2e5+5;
 5 map<int,pair<int,int> > mp;
 6 int a[maxn];
 7 ll sum;
 8 int main()
 9 {
10     int k;
11     cin>>k;
12     for(int i=1;i<=k;i++)
13     {
14         int n;
15         cin>>n;
16         sum=0;
17         for(int j=1;j<=n;j++)
18         {
19             cin>>a[j];
20             sum+=a[j];
21         }
22         for(int j=1;j<=n;j++)
23         {
24             int x=sum-a[j];
25             if(mp.count(x)&&mp[x].first!=i)
26             {
27                 cout<<"YES"<<endl;
28                 cout<<i<<' '<<j<<endl;
29                 cout<<mp[x].first<<' '<<mp[x].second<<endl;
30                 return 0;
31             }
32             mp[x]=make_pair(i,j);
33         }
34     }
35     cout<<"NO"<<endl;
36 }
View Code
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值