题意简述
若干的序列,长度和不超过 2 e 5 2e5 2e5。请你选择两个序列,从两个序列中恰好各删除一个数,使得两个序列的和相等。如果珂以,输出"Yes",并输出是从哪两个序列中删除了编号为多少的元素。多解输出任意一个。无解输出"No"。
思路框架
STL的map维护
具体思路
对于每个序列,对于不同的元素,每个都把(序列的和-这个元素值)加入到map中,标记为出现过。如果在标记之前就出现过,由于我们在一个序列里是去重的,所以一定是前面某个序列里的。那就是出现解了。我们把(序列的和-这个元素值)保存下来,直接退出。设其为 k k k。
然后,还是在去重过的序列里,看看哪几个元素满足(序列的和-这个元素值)= k k k,输出它所在的序列编号和它在序列中的编号即珂。细节还蛮多的,注意一下。
代码
#include <bits/stdc++.h>
using namespace std;
namespace Flandre_Scarlet
{
#define N 255555
#define F(i,l,r) for(int i=l;i<=r;++i)
#define D(i,r,l) for(int i=r;i>=l;--i)
#define Fs(i,l,r,c) for(int i=l;i<=r;c)
#define Ds(i,r,l,c) for(int i=r;i>=l;c)
#define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
#define MEM(x,a) memset(x,a,sizeof(x))
#define FK(x) MEM(x,0)
#define p_b push_back
void R1(int &x)
{
x=0