题目链接
题意:
给你n个数,你可以将他们分到任意的两个数组中,求怎样可以使得分别两个数组中的两两和为T的对数的数量最小。
思路:
遍历数组,如果该数没有被标记,那么标记该数并标记T-该数,flag数组中标记的数不同,表示这两个数不在同一个数组中,最后直接输出所有数的标记即可。
代码:
#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define fi first
#define ls x*2
#define rs x*2+1
const int N=1e5+7;
const int M=2e4+5;
const double eps=1e-8;
const int mod=1e9+7;
const int inf=0x7fffffff;
const double pi=3.1415926;
using namespace std;
const int INF=0x3f3f3f3f;
map<int,int>flag;
signed main()
{
IOS;
int T;
cin>>T;
while(T--)
{
flag.clear();
int n,t,a[N],sum=0,ans=0;
cin>>n>>t;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(flag[a[i]]==0&&a[i]*2!=t)
{
flag[a[i]]=1;
flag[t-a[i]]=2;
}
}
for(int i=0;i<n;i++)
{
if(a[i]*2==t)
{
cout<<sum%2<<" ";
sum++;
}
else
{
cout<<flag[a[i]]%2<<" ";
}
}
cout<<endl;
}
return 0;
}