码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-06-03 19:30:20      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:space   problem   .com   ace   mes   相同   记录   air   def   

【链接】:CF988C
【题意】:在n个序列中任选两个序列,两个序列都除去他们中的一个数,使的总和相同
【分析】:map > 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
*/

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

标签:space   problem   .com   ace   mes   相同   记录   air   def   

原文地址:https://www.cnblogs.com/Roni-i/p/9129881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!