题面

[题目描述]

“人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。”
明明收到了一大块巧克力,里面有若干小块,排成 n n n行 m m m列。每一小块都有自己特别的图案 c i , j c_{i,j} ci,j​,它们有的是海星,有的是贝壳,有的是海螺… 其中还有一些因为挤压,已经分辨不出是什么图案了。明明给每一小块巧克力标上了一个美味值 a i , j a_{i, j} ai,j​( 0 ≤ a i , j ≤ 1 0 6 0 ≤ a_{i, j} ≤ 10^6 0≤ai,j​≤106),这个值越大,表示这一小块巧克力越美味。
正当明明咽了咽口水,准备享用美味时,舟舟神奇地出现了。看到舟舟恳求的目光,明明决定从中选出一些小块与舟舟一同分享。
舟舟希望这些被选出的巧克力是连通的(两块巧克力连通当且仅当他们有公共边),而且这些巧克力要包含至少 k k k ( 1 ≤ k ≤ 5 1 ≤ k ≤ 5 1≤k≤5 ) 种。而那些被挤压过的巧克力则是不能被选中的。
明明想满足舟舟的愿望,但他又有点“抠”,想将美味尽可能多地留给自己。所以明明希望选出的巧克力块数能够尽可能地少。如果在选出的块数最少的前提下,美味值的中位数(我们定义 n n n 个数的中位数为第 ⌊ n + 1 2 ⌋ ⌊\frac{n+1}{2}⌋ ⌊2n+1​⌋小的数)能够达到最小就更好了。
你能帮帮明明吗?

[输入格式]

从标准输入读入数据。
每个测试点包含多组测试数据。
输入第一行包含一个正整数 T T T ( 1 ≤ T ≤ 5 1 ≤ T ≤ 5 1≤T≤5),表示测试数据组数。
对于每组测试数据:
输入第一行包含三个正整数 n n n, m m m 和 k k k;
接下来 n n n 行,每行 m m m 个整数,表示每小块的图案 c i , j c_{i, j} ci,j​。若 c i , j = 1 c_{i, j}=1 ci,j​=1 表示这一小块受到过挤压,不能被选中;
接下来 n n n 行,每行 m m m 个整数,表示每个小块的美味值 a i , j a_{i, j} ai,j​。

[输出格式]

输出到标准输出。
输出共包括 T T T 行,每行包含两个整数,用空格隔开,即最少的块数和最小的美味值中位数。
若对于某组测试数据,不存在任意一种合法的选取方案,请在对应行输出两个-1

[样例1输入]

1
5 4 5
3 4 3 4
5 5 -1 5
-1 4 5 5
5 5 4 2
1 -1 2 4
1 3 1 1
3 2 3 3
4 4 4 5
8 9 9 5
7 2 6 3

[样例1输出]

9 5

[数据范围与提示]

[暂无]

题解

斯坦纳树

是不是跟宝藏(或者[WC2008]游览计划)这道题很像?
那么我们也考虑使用斯坦纳树来解决这道题,虽然最后几组数据点颜色数量很多,但我们可以先考虑如何解决规模小的数据。
首先我们要找到最小块数,同宝藏这道题目一样,我们可以定义 d i s [ x ] [ y ] [ S ] dis[x][y][S] dis[x][y][S]表示当前在 ( x , y ) (x,y) (x,y)位置,现在收集到的颜色集合为 S S S,同样有两种转移,一种是枚举子集转移,一种是SPFA松弛转移,每个点的代价为1,这样,结合(很难打的)暴力分,我们就可以拿到41分的好成绩。
然后我们考虑如何找到中位数,最常见的套路就是二分中位数,找是否存在一个最小的块使得有 n 2 \frac{n}{2} 2n​(向下取整)个数小于 m i d mid mid,那么设 b i , j b_{i,j} bi,j​为当前点 ( i , j ) (i,j) (i,j)是否满足 a i , j ≤ m i d a_{i,j}≤mid ai,j​≤mid,如果是就赋值为-1否则为1(注意一定是小于等于,也不能将 a i , j = m i d a_{i,j}=mid ai,j​=mid够赋值为0,当块数为偶数,前面一半都为 m i d mid mid时,后面的做法是错误的)。
那么我们就相当于维护了两个关键字,每次计算 d i s dis dis是先比较走过的块数的和(设为 a a a),如果相同就比较走过的 b i , j b_{i,j} bi,j​的和(设为 b b b)。然而还有更为简便的做法,就是我们找一个足够大的数 M M M,将它压为一个数 a × M + b a\times M+b a×M+b,这样也能够达到同样的效果。这里的 M M M我们可以取 1 0 5 10^5 105。
每次检验我们要满足 b ≤ 0 b≤0 b≤0,也就是 a n s ≤ ( a n s + M 2 ) M × M ans≤\frac{(ans+\frac{M}{2})}{M}\times M ans≤M(ans+2M​)​×M(除法向下取整)。(不用检验 a a a,因为每次我们只改变了第二维 b b b)
这样我们就能够拿到50分的好成绩。

随机化

然而本题的颜色数量实在是太大了,无法状压,这时神仙操作就来了。
我们每次可以将每种颜色随机分配成 1 − k 1-k 1−k种不同的颜色,每次随机找最小值,随机到一定次数就可以找到最小值。
为什么这个算法是对的?是因为题目要求至少 k k k种颜色,我们将几种颜色看成一种,只会更劣,不会更优。
注意到当我们将答案的 k k k种颜色分配成不同的颜色时就是最小值,那么我们每次就有 k ! k k \frac{k!}{k^k} kkk!​的概率可以找到答案, k = 5 k=5 k=5时单次概率为 0.0384 0.0384 0.0384,大概重复 t = 200 t=200 t=200次,失败的概率就只有 3.97 × 1 0 − 4 3.97\times 10^{-4} 3.97×10−4了,因此基本上可以认为它是一个正确的算法。
复杂度: O ( T × t × ( n m 3 k + ( n m ) 2 2 k ) ) O(T\times t \times(nm3^k+(nm)^2 2^k)) O(T×t×(nm3k+(nm)22k))
然而这只是SPFA完全跑满的情况下才会发生的,这是网格图,因此完全可以通过本题。

实现

[对不起,它咕了…]

[THUSC2017][斯坦纳树+随机化]巧克力相关推荐

  1. 【THUSC2017】【LOJ2977】巧克力 斯坦纳树

    题目大意 有一个网格(或者你可以认为这是一个图),每个点都有颜色 \(c_i\) 和点权 \(a_i\). 求最小的连通块,满足这个连通块内点的颜色数量 \(\geq k\).在满足点数最少的前提下, ...

  2. 业界萌新对斯坦纳树的小结

    业界萌新对斯坦纳树的小结 0.简介 斯坦纳树问题是组合优化问题,与最小生成树相似,是最短网络的一种.最小生成树是在给定的点集和边中寻求最短网络使所有点连通.而最小斯坦纳树允许在给定点外增加额外的点,使 ...

  3. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  4. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

  5. [WC2008]游览计划(斯坦纳树)

    [Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...

  6. [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp

    管道连接 bzoj-4006 JLOI-2015 题目大意:给定一张$n$个节点$m$条边的带边权无向图.并且给定$p$个重要节点,每个重要节点都有一个颜色.求一个边权和最小的边集使得颜色相同的重要节 ...

  7. 【BZOJ4774】修路 [斯坦纳树]

    修路 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 5 5 2 ...

  8. [APIO2013]机器人[搜索、斯坦纳树]

    题意 题目链接 分析 记 g(d,x,y) 表示从 (x,y) 出发,方向为 d 到达的点,这个可以通过记忆化搜索求出,注意如果转移成环(此时向这个方向走没有意义)要特判. 记 f(l,r,x,y) ...

  9. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

最新文章

  1. pytorch中查看gpu信息
  2. Spring中的Controller ,Service,Dao是不是线程安全的?
  3. 经典算法题每日演练——第二十二题 奇偶排序
  4. Android博客文章整理
  5. python系统-基于Python搭建Django后台管理系统
  6. phpMyAdmin安装
  7. jdbc oracle存储过程,java jdbc 执行oracle存储过程
  8. Burpsuite技巧之MD5加密密码爆破、带验证码爆破
  9. go语言之进阶篇主协程先退出导致子协程没来得及调用
  10. Android 8.0 系统学习(6)---Linux内核接口要求
  11. 实现机器学习的循序渐进指南XII——Apriori
  12. NoSuchObjectException(message:ods_db.event table not found)
  13. CSF文件格式播放器
  14. python 报童模型
  15. 计算机无法控制音频,系统之家win7系统电脑音量无法调节不能调节声音的解决方法...
  16. 【2019年04月09日】A股净资产收益率ROE最高排名
  17. Excel VBA——两种获取使用最大行数的方法
  18. OpenCV————鼠标绘制和滑动条
  19. 量化交易系统用例图(一)
  20. 05 linux shell脚本 变量的取用echo;变量的设置和修改;变量的使用规范以及示例

热门文章

  1. 项目计划是实现项目目标的必要手段
  2. 网络流量顶峰到达了1000M,单位是KBPS,我的网卡是万兆网卡,我想知道这两个之间的换算关系是什么
  3. 博看文思大骗子,大家别上当
  4. 基于tensorflow2.0+opencv的花卉识别系统源码(含数据集)
  5. 中医祛斑有面子不留痕
  6. Web应用的测试内容
  7. 近两年NLP结合上下文的回复生成论文整理(含原文地址及数据集地址)
  8. 页面的高度 vh html,html – 使用VH表示高度响应适合框SVG
  9. 全网最详细数据结构----中缀转后缀
  10. cocos2dx 3.x发布说明