cf 988div3 C.Equal Sums

题目链接如下:

http://codeforces.com/contest/988/problem/C

题目大意是给你k个序列,你从中找出两个序列,使得这两个序列各自去掉一个数字以后的和相等。

学到了map的操作,每一次输入时计算sum,接着遍历所有的sum-a[i]的情况,如果这个数值出现过,就不用再进行后面的判断了,直接继续输入就好。注意分析题目,所有的n相加不超过2*10^5,所以复杂度不会T。

代码如下:

#include<bits/stdc++.h>
using namespace std;
map<int,map<int,int> > p;
map<int,int> vis;
#define N 200005
int main()
{
    int k,a[N],flag=0,ans11,ans12,ans21,ans22;
    cin>>k;
    vis.clear();
    for(int i=0;i<k;i++)
    {
        int n,sum=0;
        cin>>n;
        for(int j=0;j<n;j++)
        {
            cin>>a[j];
            sum+=a[j];
        }
        if(flag) continue;
        for(int j=0;j<n;j++)
        {
            int tmp=sum-a[j];
            if(vis[tmp]==0||p[tmp][1]==i)
            {
                vis[tmp]=1;
                p[tmp][1]=i;
                p[tmp][2]=j;
            }
            else
            {
                flag=1;
                ans11=p[tmp][1];
                ans12=p[tmp][2];
                ans21=i;
                ans22=j;
            }

        }
        }
if(flag==0)
printf("NO\n");
else
    {
    printf("YES\n");
    printf("%d %d\n",ans11+1,ans12+1);
    printf("%d %d\n",ans21+1,ans22+1);
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/renxin123/p/9135880.html