CF988 C. Equal Sums【map+pair/hash/任选两个序列,两个序列都除去他们中的一个数,使的总和相同】

【链接】:CF988C
【题意】:在n个序列中任选两个序列,两个序列都除去他们中的一个数,使的总和相同
【分析】:map<int,pair<int,int> > mp,从0~m遍历删除第i个数,mp[sum-a[i]]={j+1,i+1}; 其中key是记录删掉某个数的剩下的数,value是一对以行列号用来确定位置以方便输出。若删掉某个数剩下的数与之前的某个数相等,则马上输出并退出。时间复杂度O(n*m)
【代码】:

#include <bits/stdc++.h>
using namespace std;
const int N = 2*1e5+5;

int n,m,a[N];
map<int,pair<int,int> > mp;

int main()
{
    int n;
    int m;

    scanf("%d",&n);
    for(int j=0;j<n;j++)
    {
        scanf("%d",&m);
        int sum=0;
        for(int i=0;i<m;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        //cout<<"sum = "<<sum<<endl;
        for(int i=0;i<m;i++)
        {
            //cout<<"sum-a["<<i+1<<"] = "<<sum-a[i]<<endl;
            if(mp.count(sum-a[i]))
            {
                cout<<"YES"<<endl<<mp[sum-a[i]].first<<' '<<mp[sum-a[i]].second<<endl<<j+1<<' '<<i+1<<endl;
                return 0;
            }
        }
        for(int i=0;i<m;i++)
        {
            mp[sum-a[i]]={j+1,i+1};
            //cout<<"mp["<<sum-a[i]<<"]:"<<"j="<<j+1<<' '<<"i="<<i+1<<endl;
        }

    }
    cout<<"NO"<<endl;
}
/*
2
5
2 3 1 3 2
sum = 11
sum-a[1] = 9
sum-a[2] = 8
sum-a[3] = 10
sum-a[4] = 8
sum-a[5] = 9
mp[9]:j=1 i=1
mp[8]:j=1 i=2
mp[10]:j=1 i=3
mp[8]:j=1 i=4
mp[9]:j=1 i=5
6
1 1 2 2 2 1
sum = 9
sum-a[1] = 8
YES
1 4
2 1
*/
posted @ 2018-06-03 17:34  Roni_i  阅读(231)  评论(0编辑  收藏  举报