CF1417B Two Arrays

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\) ,是小于前值的。

注意:因为 \(1\leq a_i\leq 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;
}
posted @ 2020-09-28 09:11  jasony_sam  阅读(209)  评论(0编辑  收藏  举报