luogu#P7452. [THUSCH2017] 换桌

[THUSCH2017] 换桌

题目描述

班级聚会的时候,班主任为了方便管理,规定吃饭的时候同一个寝室的同学必须坐在一起;但是吃完饭后,到了娱乐时间,喜欢不同游戏的同学会聚到一起;在这个过程中就涉及到了座位分配的问题。

nn 张圆桌排成一排(从左到右依次编号为 00n1n-1),每张桌子有 mm 个座位(按照逆时针依次编号为 00m1m-1),在吃饭时每个座位上都有一个人;在吃完饭后的时候,每个人都需要选择一个新的座位(新座位可能和原来的座位是同一个),具体来说,第 ii 桌第 jj 个人的新座位只能在第 Li,jL_{i,j} 桌到第 Ri,jR_{i,j} 桌中选,可以是这些桌中的任何一个座位。确定好新座位之后,大家开始移动,移动的体力消耗按照如下规则计算:

移动座位过程分为两步:

  1. 从起始桌移动到目标桌对应座位,这个过程中的体力消耗为两桌距离的两倍,即从第 ii 桌移动到第 jj 桌对应座位的体力消耗为 2×ij2\times |i-j|
  2. 从目标桌的对应座位绕着桌子移动到目标座位,由于桌子是圆的,所以客人会选择最近的方向移动,体力消耗为移动距离的一倍,即从编号为 xx 的座位移动的编号为 yy 的座位的体力消耗为 min(xy,mxy)\min(|x-y|,m-|x-y|)

详情如下图: pic1 现在,给定每个客人的限制(即每个人的新座位所在的区间),需要你设计一个方案,使得所有客人消耗的体力和最小;本题中假设客人在移动的时候互不影响。

输入格式

从标准输入读入数据。

第一行输入两个数 nnmm

接下来输入 nn 行,每行 mm 个空格隔开的整数描述矩阵 LL:其中,第 ii 行的第 jj 个数表示 Li,jL_{i,j}

接下来输入 nn 行,每行 mm 个空格隔开的整数描述矩阵 RR:其中,第 ii 行的第 jj 个数表示 Ri,jR_{i,j}

数据是随机生成的,生成数据的伪代码如下:

for i <- 0 to n-1
    for j <- 0 to m-1
        L[i,j] <- 独立等概率地得到 0 到 n-1 中的一个整数
        R[i,j] <- 独立等概率地得到 0 到 n-1 中的一个整数
        if L[i,j] > R[i,j] then
            tmp <- L[i,j]
            L[i,j] <- R[i,j]
            R[i,j] <- tmp

输出格式

输出到标准输出。

输出总体力消耗的最小值,如果没有合法的方案输出 no solution

2 4
0 1 1 0
1 0 1 0
0 1 1 0
1 0 1 0
10
2 4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
no solution
2 10
0 0 1 1 0 0 0 1 0 0
1 1 1 0 0 1 0 0 0 0
1 0 1 1 1 0 1 1 1 1
1 1 1 1 1 1 0 0 1 0
22

提示

样例解释

对于样例 11pic2

00 桌的 0033 号,以及第 11 桌的 00 号和 22 号都被限制为只能坐在他们原来的桌子(可以不是原来的座位),其他人分别需要换到第 11 桌和第 00 桌;

可以发现,最优方案如上图,总体力消耗为 1010

对于样例 22,所有人都想坐到第 00 桌,所以没有合法的方案。

对于全部数据:1n3001\le n\le 3001m101\le m\le 100LiRin10\le L_i\le R_i\le n-1 。 | 测试点 | nn\le | | :----------: | :----------: | | 1~2 | 22 | | | 3~8 | 4040 | | | 9~14 | 100100 | | | 15~20 | 300300 | |