JOI汉堡肉

Posted cszmc2004

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JOI汉堡肉相关的知识,希望对你有一定的参考价值。

不靠谱做法:随机化。

靠谱做法:观察发现当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汉堡肉的主要内容,如果未能解决你的问题,请参考以下文章

汉堡中的设计模式

别样肉客™本月起进驻中国山姆会员商店,加速扩大国内零售市场规模

汉堡图标:尽管像素对齐,但面包+汉堡的大小相同?

javascript [汉堡菜单]汉堡菜单切换与annimation #js

汉堡菜单的问题

OCAC暑期比赛第三场 G题 汉堡汪 题解