码迷,mamicode.com
首页 > 其他好文 > 详细

JOI汉堡肉

时间:2020-05-03 10:47:19      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:矩形覆盖   形式   dfs序   min   amp   分配   这一   它的   lse   

不靠谱做法:随机化。

靠谱做法:观察发现当k<4时,答案一定处于一个关键矩形(min(r[i]),max(l[i]),min(y[i]),max(x[i]))的边界。

如果不处在边界上,显然可以把它移到边界。

当k<4时,由抽屉原理可得一定有一个关键点在某个定点。

搜索所有顶点,在搜索中可以删除这个点,移除所有包含它的矩形再做一遍算法。

这个算法在k<4是正确的。但是在k=4时,可能所有点都在边上,显然上面的算法错误。

问题被我们转化成了求一个让所有点都在边上的一组解。使用4个变量描述边的情况。

考虑每个矩形,问题实际上可以被分成几类讨论:

1.矩形完全包含关键矩形,不作处理

2.矩形与关键矩形不交于边界,无解(题目不会无解)

3.矩形与关键矩形交于一角,则问题转化为两个不等式有至少1个要成立。

4.矩形与关键矩形交于一边,则问题转化成要求一个不等式成立。

5.矩形覆盖了关键矩形的一边,则这一边一定有一个点在这个矩形中,所以不作处理

实际上,可以使用2sat解决这个问题。

设f[x][i]表示x是否<=i,则~f[x][i]=x是否>i

所以,l<=x<=r实际上就是让f[x][l-1]为false,f[x][r]为true,就是让2个变量为true则4情况可以被处理。

3情况的处理可以把不等式转化一下。

l<=a<=r且x<=b<=y就是(~f[a][l-1]&f[a][r])|(~f[b][x-1]&f[b][y])

这个不是2sat形式,但是可以使用or的分配律转化成(~f[a][l-1]|~f[b][x-1])&(~f[a][l-1]|f[b][y])&(f[a][r]|~f[b][x-1])&(f[a][r]|f[b][y])

变成了4个不等式,这样子就变成了2sat形式。

把所有f[x][l]->f[x][l+1]连边,则跑一下2sat,用tarjan的dfs序输出方案即可

注意要离散化。

JOI汉堡肉

标签:矩形覆盖   形式   dfs序   min   amp   分配   这一   它的   lse   

原文地址:https://www.cnblogs.com/cszmc2004/p/12820792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!