安静下来,仔细想想,真的很简单的,怎么就做了那么久。
主要思想是等效处理,然后均分。
写的好的,会写的很短吧。
#include <iostream>
#include <vector>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
/* define */
#define sf(a) scanf("%d",&a)
#define sf3(a,b,c) scanf("%d%d%d",&(a),&(b),&(c))
#define sfs(a) scanf("%s",a)
#define clr(a) memset(a,0,sizeof(a))
#define pf(a) printf("%d\n",a)
#define pfI(a) printf("%I64d\n",a)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define rep1(i,a,b) for(int i=(a);i<(b);i++)
#define repd(i,a,b) for(int i=(a);i>=(b);i--)
/* define */
/* segment tree */
#define root 1,1,n
#define now o,l,r
#define m (l+r)/2
#define lson o*2,l,m
#define rson o*2+1,m+1,r
/* segment tree */
/* num theory */
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
/* num theory */
typedef long long ll;
const int N =250;
const int inf = (1<<29);
int first[N],fuck[N],hh[N],a[N];
int suck[N],hash[N],ans[N];
bool cmp(int a,int b){
return hh[a]>hh[b];
}
int main(){
int n;
while(~sf(n)){
clr(hh);
rep(i,1,2*n){
sf(a[i]);
hh[a[i]]++;
}
clr(ans);
int ss=0,l1=0,l2=0;
clr(hh);
rep(i,1,2*n){
if(hh[a[i]]<=1)
ss++;
hh[a[i]]++;
}
if(ss%2==0){
ss/=2;
pf(ss*ss);
}
else{
ss/=2;
pf(ss*(ss+1));
}
clr(suck);
int s1=0;
clr(fuck);
rep(i,1,2*n){
if(hh[a[i]]>1 && !fuck[a[i]]){
s1++;
fuck[a[i]]=1;
}
}
s1*=2;
clr(fuck);
rep(i,1,2*n){
if(hh[a[i]]>1 && !fuck[a[i]] && l1<s1/2){
ans[i]=1;
l1++;
fuck[a[i]]=1;
suck[i]=1;
}
}
clr(fuck);
rep(i,1,2*n){
if(hh[a[i]]>1 && !suck[i] &&!fuck[a[i]]&& l2<(s1-s1/2)){
ans[i]=2;
l2++;
fuck[a[i]]=1;
suck[i]=1;
}
}
clr(fuck);
rep(i,1,2*n){
if(!fuck[a[i]] && hh[a[i]]==1 && l1<ss && !suck[i]){
l1++;
ans[i]=1;
fuck[a[i]]=1;
suck[i]=1;
}
}
clr(fuck);
rep(i,1,2*n){
if(!fuck[a[i]] && hh[a[i]]==1 && l2<ss && !suck[i]){
ans[i]=2;
l2++;
fuck[a[i]]=1;
suck[i]=1;
}
}
rep(i,1,2*n){
if(!suck[i]){
if(l1<n){
l1++;
ans[i]=1;
}
else {
l2++;
ans[i]=2;
}
}
}
printf("%d",ans[1]);
rep(i,2,2*n){
printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}