[比赛][二分][计算集合][定长圆最大点覆盖] 2018 ICPC 沈阳网络赛 E The cake is a lie

比赛的时候一看计算几何直接跳过了,其实不是不可以做。。。

这个里面,各个草莓的半径其实对计算影响不大,由于圆的对称性,只要求出能覆盖s个草莓的圆心的最小圆就可以了,输出答案时加上草莓的半径r即可。

然后求定长圆的最大点覆盖就是有点模板了,有两种算法,n^3和n^2logn的,但是既然是抄板子那肯定是抄最快的了。。。

继续阅读“[比赛][二分][计算集合][定长圆最大点覆盖] 2018 ICPC 沈阳网络赛 E The cake is a lie”

[二分图][建图] UVa 12168 Cat vs Dog

比赛时候其实想的就是正解,但是没时间实现了。

这里并不是把猫狗分离开来,而是把voter分离开,换句话说原来的边变成了点,支持猫的在一边,支持狗的在另一边,如果有冲突的话连一条边,这样的话就是求最大独立集了。

本来看这个输入感觉头疼,后来想了想,忽然意识到:1 重复的人可以不用管,照例读入建立点,因为把他变成点之后对图没有任何影响。2  可以不用管字符后的数字,直接把他们当成一个整体就好了,整个字符串比较。 3  建立图的时候可以不用分左右两边,只要i和j有冲突就line[i][j]=line[j][i]=1;这样会使得建图的过程更简单,然后相当于把二分图对称了一下,最后输出的时候最大匹配数除以2就可以了.

继续阅读“[二分图][建图] UVa 12168 Cat vs Dog”

[思维][贪心] UVa1613 K-Graph Oddity

先说结论:构造的方法就是以任意一个点开始dfs,对于dfs到的点,把他的颜色设置为没有在与他所有的相邻的已经被染过色的节点的颜色的集合中出现过的最小值,比如和它相邻有4个点,其中3个分别为1,3,3,另一个未染色,那么就把当前的颜色设置为2。

这个做法,网上并没有找到一个说得过去的证明,我自己也无法严格证明贪心过程的正确性,也没有找到官方题解,就是很玄学。而且,同样的贪心过程,如果先对一个点先dfs再染色,也就是根据子孙节点的颜色修改当前的颜色,就会出现某个节点大于k的情况(虽然仍然是保证了不同点之间不同染色),但是如果先染色再dfs,也就是先处理好搜索过的节点,根据祖先节点修改当前的节点,就能保证通过所有数据。
继续阅读“[思维][贪心] UVa1613 K-Graph Oddity”