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;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/85150137