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汉堡肉的主要内容,如果未能解决你的问题,请参考以下文章
别样肉客™本月起进驻中国山姆会员商店,加速扩大国内零售市场规模