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;
如果某两个序列各删除一个数,得到的总和相等,
也就是后一个序列得到的总和已存在(被前一个所记录)的话,就找到了
•代码
View Code1 #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 }