1. 程式人生 > >Codeforces Round #486 (Div. 3) C. Equal Sums map

Codeforces Round #486 (Div. 3) C. Equal Sums map

                                           C. Equal Sums

題目連結:
傳送門


題意:

給出很多序列,求其中兩個序列分別刪除一個元素後和相等的兩個序列。


思路:

求出每個序列的和,然後將每個序列去除其中一個元素的和存到一個map中,然後遍歷每個元素在map中找除了與他同行相同的序列之和即可。


程式碼如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn=2*1e5+5;
int n;
vector<int>v[maxn];
int sum[maxn];
map<int,pair<int,int> >ma;
int main()
{
    memset (sum,0,sizeof(sum));
    int k;
    scanf("%d",&k);
    for (int i=1;i<=k;i++)
    {
        int m;
        scanf("%d",&m);
        for (int j=0;j<m;j++)
        {
            int x;
            scanf("%d",&x);
            v[i].push_back(x);
            sum[i]+=x;
        }
        for (int j=0;j<m;j++)
        {
            int x=sum[i]-v[i][j];
            ma[x]={i,j+1};
        }
    }
    int ans1,x,ans2,y;
    for (int i=1;i<=k;i++)
    {
        int Size=v[i].size();
        for (int j=0;j<Size;j++)
        {
            int x=sum[i]-v[i][j];
            if(ma[x].first!=i)
            {
                    printf("YES\n");
                    printf("%d %d\n%d %d\n",i,j+1,ma[x].first,ma[x].second);
                    return 0;
            }
        }
    }
    printf("NO\n");

    return 0;
}