zoukankan      html  css  js  c++  java
  • CF 988C Equal Sums 思维 第九题 map

    Equal Sums
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    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 ii, xx (1ik,1xni1≤i≤k,1≤x≤ni), in the third line — two integers jj, yy (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
    Note

    In the first example there are two sequences [2,3,1,3,2][2,3,1,3,2] and [1,1,2,2,2,1][1,1,2,2,2,1]. You can remove the second element from the first sequence to get [2,1,3,2][2,1,3,2] 

    and you can remove the sixth element from the second sequence to get [1,1,2,2,2][1,1,2,2,2].The sums of the both resulting sequences equal to 88, i.e. the sums are equal.

    题意: 给你k个数列(2<=k<=2*10^5),每个数列长度是n(n<=2*10^5),所有序列的总长度小于等于2*10^5,问是否有两个序列去掉序列其中一个值后两个序列序列和相等

    用一个map存下每个序列去掉其中一个值后的剩余值及其的位置

    然后遍历每个序列,看有没有一个序列去掉一个值后的剩余值被map记录,若有则输出这个值的位置及遍历到的值的位置,没有输出NO

    #include <map>
    #include <set>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <vector>
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define debug(a) cout << #a << " " << a << endl
    using namespace std;
    const int maxn = 1e6 + 10;
    const int mod = 1e9 + 7;
    typedef long long ll;
    ll a[maxn];
    int main(){
        std::ios::sync_with_stdio(false);
        ll T;
        while( cin >> T ) {
            ll flag = false;
            map< ll, pair< ll, ll > > mm;
            for( ll i = 1; i <= T; i ++ ) {
                ll n, sum = 0, t;
                cin >> n;
                for( ll j = 1; j <= n; j ++ ) {
                    cin >> a[j];
                    sum += a[j];
                }
                for( ll j = 1; j <= n; j ++ ) {
                    t = sum - a[j];
                    if( mm.count(t) && !flag && mm[t].first != i ) {
                        cout << "YES" << endl;
                        cout << i << " " << j << endl;
                        cout << mm[t].first << " " << mm[t].second << endl;
                        flag = true;
                    }
                    mm[t] = make_pair( i, j );
                }
            }
            if( !flag ) {
                cout << "NO" << endl;
            }
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    Windows 8 C#调用C++编写的Windows运行时组件
    Metro style App Datetime formating.
    《编程匠艺》读书笔记之一
    ContextMenu的使用
    单例模式
    c# 类中字段属性设计
    Metro style app 文件查找
    Win 8 学习资料汇总
    Metro C++ 初体验 第二周
    Metro style app 文件、文件夹的选择、文件的保存。
  • 原文地址:https://www.cnblogs.com/l609929321/p/9220742.html
Copyright © 2011-2022 走看看