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

 1 #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 }
View Code

 

posted @ 2019-07-22 21:08  HHHyacinth  阅读(136)  评论(0编辑  收藏  举报