CF547D
给定 n 个整点。
你要给每个点染成红色或蓝色。
要求同一水平线或垂直线上两种颜色的数量最多相差 1。
n,xi,yi ≤ 2×1e5。
====================================================================
怎么说呢,这可能是国集里最简单的题了
如果同一水平线或垂直线的点只有一个,那么显然我们可以随便涂这个点。如果有两个或者更多呢?
我们要保证涂的颜色的数量尽量的相同,那么我们可以先保证:同一水平线或垂直线上,
相邻的点颜色互不相同,由于只有两种颜色,完全可以把相邻的点连上边,保证一条边的两点颜色不同就可以了(二分图染色)
这里提供一种连边的方式:当前水平线或者垂直线如果还没有点,就把当前点记录下来。如果数组里已经存了一个点,那么就用当前点与数组的点连边,然后将数组置为0
code
//这里是建图
int x,y;
cin >> x >> y;
if(line[x])
{
add(i,line[x]),add(line[x],i);
line[x] = 0;
}
else line[x] = i;
if(lie[y])
{
add(i,lie[y]),add(lie[y],i);
lie[y] = 0;
}
else lie[y] = i;