Codeforces Round #486 (Div. 3) C. Equal Sums map+结构体

C. Equal Sums

You are given kk sequences of integers. The length of the ii-th sequence equals to nini.

You have to choose exactly two sequences ii and jj (iji≠j) such that you can remove exactly one element in each of them in such a way that the sum of the changed sequence ii (its length will be equal to ni1ni−1) equals to the sum of the changed sequence jj (its length will be equal to nj1nj−1).

Note that it's required to remove exactly one element in each of the two chosen sequences.

Assume that the sum of the empty (of the length equals 00) sequence is 00.

Input

The first line contains an integer kk (2k21052≤k≤2⋅105) — the number of sequences.

Then kk pairs of lines follow, each pair containing a sequence.

The first line in the ii-th pair contains one integer nini (1ni<21051≤ni<2⋅105) — the length of the ii-th sequence. The second line of the ii-th pair contains a sequence of nini integers ai,1,ai,2,,ai,niai,1,ai,2,…,ai,ni.

The elements of sequences are integer numbers from 104−104 to 104104.

The sum of lengths of all given sequences don't exceed 21052⋅105, i.e. n1+n2++nk2105n1+n2+⋯+nk≤2⋅105.

Output

If it is impossible to choose two sequences such that they satisfy given conditions, print "NO" (without quotes). Otherwise in the first line print "YES" (without quotes), in the second line — two integers iixx (1ik,1xni1≤i≤k,1≤x≤ni), in the third line — two integers jjyy (1jk,1ynj1≤j≤k,1≤y≤nj). It means that the sum of the elements of the ii-th sequence without the element with index xx equals to the sum of the elements of the jj-th sequence without the element with index yy.

Two chosen sequences must be distinct, i.e. iji≠j. You can print them in any order.

If there are multiple possible answers, print any of them.

Examples
input
Copy
2
5
2 3 1 3 2
6
1 1 2 2 2 1
output
Copy
YES
2 6
1 2
input
Copy
3
1
5
5
1 1 1 1 1
2
2 3
output
Copy
NO
input
Copy
4
6
2 2 2 2 2 2
5
2 2 2 2 2
3
2 2 2
5
2 2 2 2 2
output
Copy
YES
2 2
4 1

题意:给你n行序列,从中选取两个序列s1,s2,求得s1删去一个元素的和sum1,s2删去一个元素的和sum2,使得sum1==sum2。如果存在这样的s1,s2:输出它来自第几行,删掉的是这个序列的第几个元素。

思路:使用map映射。设当前序列为s,处于第i行,求得s删去第k位置元素的和sum,则map[sum]=(i,k)。

每输入一个序列s,进行求和统计,将sum 作键值,映射结构体(i,k),如果发现当前sum已有结构体对应,即为所求的s1,s2。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define exp 1e-8
#define mst(a,k) memset(a,k,sizeof(a))
#define pi acos(-1.0)
using namespace std;
struct node
{
    ll from,id;
};
map<ll,node>mp;
ll n,m,a[200010],flag;
int main()
{
    while(~scanf("%lld",&n))
    {
        mp.clear();
        flag=0;
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld",&m);
            ll sum=0;
            for(ll j=1;j<=m;j++)
            {
                scanf("%lld",&a[j]);
                sum+=a[j];   //先求总和
            }
            if(flag==1)continue;   //如果答案已经找到,不打断输入
            for(ll j=1;j<=m;j++)
            {
                ll sum1=sum-a[j];   //求得每个删1元素的和
                if(mp[sum1].from&&(mp[sum1].from!=i))   //如果sum已经存在,且对应序列不是它自己
                {
                    flag=1;
                    printf("YES\n");
                    printf("%lld %lld\n",mp[sum1].from,mp[sum1].id);
                    printf("%lld %lld\n",i,j);
                    break;
                }
                else   //映射赋值
                {
                    mp[sum1].from=i;
                    mp[sum1].id=j;
                }
            }
        }
        if(flag==0)printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/s540239976/article/details/81000329