1 条题解

  • 0
    @ 2025-8-24 21:46:30

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar lovelyboy
    **

    搬运于2025-08-24 21:46:30,当前版本为作者最后更新于2018-12-13 13:31:57,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    调一年后终于过了,兴奋地点开了题解,然后居然是

    dfs+剪枝

    然后楼下大神的代码只有60行,emm

    哎简单讲一下我的做法,2-sat+前缀和优化建图+bitset压位 首先发现确定第一行和第一列就可以确定整个矩阵,而且矩阵第i行第j列的值一定可以通过(1,1)(i,1)(1,j)(1,1)(i,1)(1,j)三个值算出来。由于每个格子的取值范围很小,我们不妨枚举第一个格子的取值,那么整个矩阵的限制就会转化为l(i,1)±(1,j)rl\leq(i,1)\pm(1,j)\leq r 其中llrr都是可以通过矩阵的信息算出来的。

    然后对于将每个(1,j)(1,j)(i,1)(i,1)的取值拆成PP个状态,第ii状态表示这个格子是否可以取小于等于ii的值,根据2-sat对每个状态建truetruefalsefalse两个点,然后iitruetruei+1i+1truetrue连边,因为如果取了小于等于ii那一定取i+1i+1,同时第p1p-1个格子一定选,那么将p1p-1falsefalsep1p-1truetrue连边。

    对于节点之间不等式的关系我们将大于和小于拆成两条限制,然后建边。不妨以 l(i,1)+(1,j)l\leq(i,1)+(1,j)为例((i,1)+(1,j)r(i,1)+(1,j)\leq r和这个是一样的)。我们枚举(i,1)(i,1)的取值。假设我们令(i,1)k(i,1)\leq k,那么可得(1,j)>lk1(1,j)\gt l-k-1 所以我们将(i,1)(i,1)kk号节点的truetrue(1,j)(1,j)lk1l-k-1falsefalse连边(false表示小于等于不成立也就是大于)即可。

    最后跑2-sat,由于要求字典序最小所以需要用O(VE)O(VE)的那个暴力算法,但是这样过不了所以可以用bitset压一下变成O(VE64)O(\frac{VE}{64})就可以过了

    • 1

    信息

    ID
    2281
    时间
    1000ms
    内存
    125MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者