Codeforces Round #486 (Div. 3) C "Equal Sums" (map+pair<>)
•题意
给你 k 个序列,第 i 个序列含有 ni 个元素;
问是否存在两个不同的序列 i,j;
满足序列 i 删除某个数后的总和等于序列 j 删除某个数后的总和;
•题解
定义 map<int , pair<int ,int > >f;
为了方便表述,将上述定义改为 map<x ,pair<y ,z > >f;
表示序列 y 删除第 z 个数后的总和为 x;
对于第 i 个序列,在删除第 j 个数后,求出删除后的总和 cur;
判断 f 中是否存在 cur,如果存在,直接输出,反之继续找;
•Code
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 #define pii pair<int ,int > 4 const int maxn=2e5+50; 5 6 int k; 7 int a[maxn]; 8 map<int ,pii >f; 9 10 int main() 11 { 12 scanf("%d",&k); 13 for(int i=1;i <= k;++i) 14 { 15 int n; 16 scanf("%d",&n); 17 18 int sum=0; 19 for(int j=1;j <= n;++j) 20 { 21 scanf("%d",a+j); 22 sum += a[j]; 23 } 24 25 for(int j=1;j <= n;++j) 26 { 27 int cur=sum-a[j]; 28 29 ///判断之前的序列是否存在cur 30 ///f[cur].first != i 是必要的 31 ///测试如下样例便可明白 32 /** 33 1 34 2 35 1 1 36 */ 37 if(f.count(cur) && f[cur].first != i) 38 { 39 puts("YES"); 40 pii tmp=f[cur]; 41 printf("%d %d\n",i,j); 42 printf("%d %d\n",tmp.first,tmp.second); 43 return 0; 44 } 45 f[cur]=pii(i,j); 46 } 47 } 48 puts("NO"); 49 50 return 0; 51 }