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
原文地址:https://www.cnblogs.com/MMMinoz/p/11228539.html