Solution
因为要求 (f) 最小,我们发现只要将 (a_i) 和 (T-a_i) 染成不同的颜色就行了。
但是当 (T) 为偶数的时候, (frac T2) 是要一个染白,一个染黑这样轮流的。
举个例子:设 (k) 为 (frac T2) 的个数,那么如果将 (k) 个全染一个颜色,则 (f) 起码是 (frac{(k-1)k}{2}) ,然后平均分成两种颜色,则是 ((frac k2-1)frac k2) ,是小于前值的。
注意:因为 (1leq a_ileq 10^9) ,所以可以拿 (map) 来做映射。
(要么开全局记得清零,要么开局部变量,不要像我一样没有清零然后考场爆零)
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,t,col[N],a[N],pre;
map<int,int> mp;
int main(){
int T;
scanf("%d",&T);
while(T--){
pre=0;
mp.clear();
scanf("%d%d",&n,&t);
if(t%2){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(mp[a[i]]) col[i]=1;
else{
col[i]=0;
if(a[i]<=t) mp[t-a[i]]=1;//可以不判的,比赛的时候忘了qwq
}
}
for(int i=1;i<=n;i++)
printf("%d ",col[i]);
puts("");
}
else{
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]==t/2){
if(pre) col[i]=1^col[pre];
pre=i;
continue;
}
if(mp[a[i]]) col[i]=1;
else{
col[i]=0;
if(a[i]<=t) mp[t-a[i]]=1;
}
}
for(int i=1;i<=n;i++)
printf("%d ",col[i]);
puts("");
}
}
return 0;
}