村里拆迁了,政府给村里的 nn 户人家准备了一个安置小区。这个小区是长条型的,里面有 mm 栋楼,这些楼房坐落在一条东西走向的马路旁,自西向东依次标号 1∼m1∼m ,小区的大门在最西边,第 ii 栋楼距离小区大门 pipi 米。
拆迁户是挑剔的,每一户人家对每栋楼都有着不同的不满意度,记 si,jsi,j 为第 ii 户人家对第 jj 栋楼的不满意度。
你作为村委会干部被领导安排给这 nn 户村民分配房子,每栋楼里安置村民的户数没有上限。
特别的,村民们向你提了 kk 个条件,每个条件是这样的,由于第 xx 户村民与第 yy 户村民是好朋友,他们两户房子的相距不能超过 dd 米。
现在你需要在满足这 kk 个条件的前提下,给每户村民分配房子,使得总的不满意度最小。
为了防止输入过大带来的常数问题,C++ 选手请尽量使用关闭流同步的 std::cin 和 std::cout 实现输入输出,否则可能出现因读入输出问题导致的 TLE 等。
int main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); // your code return 0; }
第一行一个整数 TT (1≤T≤11)(1≤T≤11),表示测试数据组数。
每组数据的第一行包含三个整数 n,m,kn,m,k (1≤n×m≤2000,0≤k≤n(n−1)2,0≤k×m≤104)(1≤n×m≤2000,0≤k≤2n(n−1),0≤k×m≤104),分别代表村民户数,小区楼数与村民要求数。
接下来一行 mm 个整数 p1,p2,…,pmp1,p2,…,pm (0≤pi≤109)(0≤pi≤109),其中 pipi 代表第 ii 栋楼的位置。
接下来 nn 行,每行包含 mm 个整数 si,1,si,2,…si,msi,1,si,2,…si,m (1≤si,j≤1000)(1≤si,j≤1000)。
接下来 kk 行,每行包含三个整数 x,y,dx,y,d (1≤x,y≤n,0≤d≤109)(1≤x,y≤n,0≤d≤109),表示一个条件。
2
4 2 4
1 2
6 2
1 6
6 2
1 6
1 2 2
1 3 2
2 4 2
3 4 2
4 2 2
1 3
6 2
1 6
6 2
1 6
1 2 1
1 3 1
6
11