cf B. Two Heaps

时间:2023-03-09 16:49:17
cf B. Two Heaps

http://codeforces.com/contest/353/problem/B

题意:要把2*n个两位数分成两部分,使得第一部分上的数和第二部分上的两位数组成四位数。求怎么分能使构成的不同的四位数个数最多

如果2*n个数都是不同的,怎么分都一样的组成n*n个。如果有相同的,将它们按数量排序,均分到两个集合中就可以。

 #include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std; int n;
int num[];
int a[],b[];
struct node
{
int x;
int id;
int flag;
int num;
bool operator <(const node &a)const
{
return (num<a.num)||(num==a.num&&x<a.x);
}
}p[]; bool cmp(node a,node b)
{
return a.id<b.id;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int cnt=;
memset(num,,sizeof(num));
for(int i=; i<=*n; i++)
{
int m;
scanf("%d",&m);
p[cnt].id=i;
p[cnt++].x=m;
num[m]++;
}
for(int i=; i<cnt; i++)
{
p[i].num=num[p[i].x];
}
sort(p,p+cnt);
int t1=,t2=;
for(int i=; i<cnt; i+=)
{
p[i].flag=;
if(!a[p[i].x])
{
a[p[i].x]++;
t1++;
}
p[i+].flag=;
if(!b[p[i+].x])
{
b[p[i+].x]++;
t2++;
}
}
printf("%d\n",t1*t2);
sort(p,p+cnt,cmp);
for(int i=; i<cnt; i++)
{
if(i==)
{
if(p[i].flag==)
printf("");
else
printf("");
}
else
{
if(p[i].flag==)
printf("");
else printf("");
}
}printf("\n");
}
return ;
}