1. 程式人生 > >CF988 C. Equal Sums【map+pair/hash/任選兩個序列,兩個序列都除去他們中的一個數,使的總和相同】

CF988 C. Equal Sums【map+pair/hash/任選兩個序列,兩個序列都除去他們中的一個數,使的總和相同】

相同 value can 個數 sca code esp 分析 return

【鏈接】: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/任選兩個序列,兩個序列都除去他們中的一個數,使的總和相同】