Equal Sums

题意:给你几个数列,问是否存在这样两个数列使得他们删去各自的某一个成员后二者的和相等。
因为题目限制了nini<=2e5,所以这题的解法很多。
感觉自己最初的解法有点复杂了,在这里我讲一个STL应用的解法。
我们定义sumisumi为第ii行的和,,pospos表示第ii行的第个.
map<sumi,pair<idi,pos>>map<sumi,pair<idi,pos>>这样便简单的存下了我们需要的所有信息。
对于每一个新的行,我们找前面是否出现过sumisumi等于我现在的某一个sumjsumj,
只需mp.lowermp.lower_bound(sumj)bound(sumj)返回迭代器即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<set>
#include<queue>
#include<limits.h>
#include<string.h>
#include<map>
#include<list>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf int(0x3f3f3f3f)
#define mod int(1e9+7)
#define eps double(1e-6)
#define pi acos(-1.0)
#define lson root << 1
#define rson root << 1 | 1
map< int,pair<int ,int> >mmp;
map< int ,pair<int,int> >::iterator it;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int zu;
mmp.clear();
cin>>zu;
for(int t=1;t<=zu;t++)
{
int n;
cin>>n;
vector<int> v;
int sum=0;
int x;
for(int i=0;i<n;i++)
cin>>x,v.push_back(x),sum+=x;
for(int i=0;i<n;i++)
{
int ans=sum-v[i];
if(t!=1)
{
it=mmp.lower_bound(ans);
if(it!=mmp.end()&&it->first==ans&&it->second.first!=t)
{
cout<<"YES"<<endl;
cout<<it->second.first<<" "<<it->second.second<<endl;
cout<<t<<" "<<i+1<<endl;
return 0;
}
}
mmp[ans]=make_pair(t,i+1);
}
}
cout<<"NO"<<endl;
}

本文介绍了一种使用STL解决EqualSums问题的方法。通过定义sum_i为第i行的和,利用map存储每行删除一个元素后的和,快速判断是否存在两行在删除一个元素后和相等的情况。

被折叠的 条评论
为什么被折叠?



