题意:有k个数列,第i个序列有n[i]个数字,问能否找到两个序列使得这两个序列各自删除一个数后,两个序列的和一样,有的话输出这两个序列的id和删除数字的id。
2≤k≤2∗105,1≤n≤2∗105
2
≤
k
≤
2
∗
10
5
,
1
≤
n
≤
2
∗
10
5
思路:注意最后一个条件,即数字个数不超过 2∗105 2 ∗ 10 5 ,所以我们就可以用map<int, pair<int, int> >存储下来每个序列删除每个数字时对应的和。因为 k,n k , n 范围很大,所以我们开不了 2∗105∗2∗105 2 ∗ 10 5 ∗ 2 ∗ 10 5 的数组,其实这些数据也没必要存储,我们只需要map里面的信息就行了,所以开一个临时数组存一下当前输入序列的数字就OK了。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int k, n, a[MAXN];
map<int, pair<int, int> > mp;
int main()
{
scanf("%d", &k);
bool flag = false;
for (int i = 1; i <= k; i++)
{
scanf("%d", &n);
int sum = 0;
for (int j = 1; j <= n; j++)
{
scanf("%d", &a[j]);
sum += a[j];
}
if (flag) continue;
for (int j = 1; j <= n; j++)
{
if (mp.count(sum-a[j]))
{
auto x = mp[sum-a[j]];
if (x.first != i)
{
printf("YES\n");
printf("%d %d\n", i, j);
printf("%d %d\n", x.first, x.second);
flag = true;
break;
}
}
else
{
mp[sum-a[j]] = make_pair(i,j);
}
}
}
if (!flag) printf("NO\n");
return 0;
}