CF547D

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;
posted @ 2020-12-02 11:45  星&夜  阅读(46)  评论(0编辑  收藏  举报