题目描述

​“人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道。”

​ 明明收到了一大块巧克力,里面有若干小块,排成n行m列。每一小块都有自己特别的图案ci,j,它们有的是海星,有的是贝壳,有的是海螺......其中还有一些因为挤压,已经分辨不出是什么图案了。明明给每一小块巧克力标上了一个美味值ai,j ( 0≤ai,j≤106 ),这个值越大,表示这一小块巧克力越美味。

​正当明明咽了咽口水,准备享用美味时,舟舟神奇地出现了。看到舟舟恳求的目光,明明决定从中选出一些小块与舟舟一同分享。

​舟舟希望这些被选出的巧克力是连通的(两块巧克力连通当且仅当他们有公共边),而且这些巧克力要包含至少k ( 1≤k≤5 )种。而那些被挤压过的巧克力则是不能被选中的。

​ 明明想满足舟舟的愿望,但他又有点“抠”,想将美味尽可能多地留给自己。所以明明希望选出的巧克力块数能够尽可能地少。如果在选出的块数最少的前提下,美味值的中位数(我们定义n个数的中位数为第⌊n+12⌋小的数)能够达到最小就更好了。

​ 你能帮帮明明吗?

输入格式

从标准输入读入数据。

​ 每个测试点包含多组测试数据。

​ 输入第一行包含一个正整数 T (1≤T≤5),表示测试数据组数。

​ 对于每组测试数据:

​ 输入第一行包含三个正整数n,m和k;

​ 接下来n行,每行m个整数,表示每小块的图案ci,j。若ci,j=−1表示这一小块受到过挤压,不能被选中;

​ 接下来n行,每行m个整数,表示每个小块的美味值ai,j。

输出格式

输出到标准输出。

​ 输出共包括T行,每行包含两个整数,用空格隔开,即最少的块数和最小的美味值中位数。

​ 若对于某组测试数据,不存在任意一种合法的选取方案,请在对应行输出两个−1。

数据范围 n×m≤233 ci,j=−1或1≤ci,j≤n×m


题解:

    • 二分一个出现过的美味度做中位数,考虑如何$check$;
    • 而判断一个数$x$>=中位数,只要在数列里面找到至少$\lfloor \frac{n+1}{2} \rfloor$个小于等于$x$的数即可;
    • 将$a_{ij}$大于中位树的设为$1001$,小于等于的设为$999$
    • 在满足连通和颜色的条件下取尽量小的代价和就做到了个数做第一关键字,中位数做第二关键字;
    • 所以每次将(最小值+500)/1000得到个数,将最小值和个数*1000比较,如果小于等于证明合法;
    • 具体地求最小值:
    • 将颜色在$0-k$内随机一个新颜色,考虑新颜色$0-k$全都取就取了$k$种,多随机几次;
    • 每次斯坦纳树求出最小代价;
    • $spfa$算满的话是:$O(T* t *(nm \ 3^{k} + (nm)^2 \ 2^k) )$;
    • 感觉整个题充满了脑洞。。。。
    • (最开始写的解法里面,等于的设置成1000,在最小个数为偶数的情况下会wa,希望没有坑到太多人。。。。。)

    •  #include<bits/stdc++.h>
      #define inf 0x3f3f3f3f
      #define fir first
      #define sec second
      #define mk make_pair
      using namespace std;
      const int N=;
      int n,m,k,a[N][N],c[N][N],sub[N],tot,f[N][N][<<],id[N][N],col[N],b[N][N],ans1,ans2,vis[N][N];
      typedef pair<int,int>pii;
      queue<pii>q;
      int dx[]={,,,-};
      int dy[]={,-,,};
      void spfa(int s){
      while(!q.empty()){
      int x=q.front().fir, y=q.front().sec;
      q.pop();vis[x][y]=;
      for(int i=;i<;i++){
      int nx=x+dx[i], ny=y+dy[i];
      if(nx<||nx>n||ny<||ny>m||!~c[nx][ny])continue;
      if(f[nx][ny][s] > f[x][y][s] + b[nx][ny]){
      f[nx][ny][s] = f[x][y][s] + b[nx][ny];
      if(!vis[nx][ny])vis[nx][ny]=,q.push(mk(nx,ny));
      }
      }
      }
      }
      void steiner(){
      for(int i=;i<=n;i++)
      for(int j=;j<=m;j++){
      for(int s=;s<<<k;s++)f[i][j][s]=inf;
      if(~c[i][j])f[i][j][<<col[c[i][j]]]=b[i][j];
      }
      for(int s=;s<<<k;s++){
      for(int i=;i<=n;i++)
      for(int j=;j<=m;j++)if(~c[i][j]){
      for(int t=s&(s-);t;t=s&(t-)){
      f[i][j][s] = min(f[i][j][s], f[i][j][t] + f[i][j][s^t] - b[i][j]);
      }
      if(f[i][j][s]!=inf)q.push(mk(i,j)),vis[i][j]=;
      }
      spfa(s);
      }
      for(int i=;i<=n;i++)
      for(int j=;j<=m;j++)ans1 = min(ans1, f[i][j][(<<k)-]);
      }
      int main(){
      freopen("T1.in","r",stdin);
      freopen("T1.out","w",stdout);
      srand(time(NULL));
      int T;scanf("%d",&T);
      while(T--){
      scanf("%d%d%d",&n,&m,&k);
      tot=;
      for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&c[i][j]);
      for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&a[i][j]),sub[id[i][j]=++tot]=a[i][j];
      sort(sub+,sub+tot+);
      tot = unique(sub+,sub+tot+) - sub - ;
      int l=,r=tot,fg=;
      while(l<r){
      int mid=(l+r)>>;
      for(int i=;i<=n;i++)for(int j=;j<=m;j++)b[i][j]=a[i][j]>sub[mid]?:/*a[i][j]<sub[mid]?*//*:1000*/;
      ans1 = inf;
      for(int I=;I<=;I++){
      for(int i=;i<=n;i++)for(int j=;j<=m;j++)col[id[i][j]]=rand()%k;
      steiner();
      }
      if(ans1==inf){fg=;puts("-1 -1");break;}
      ans2 = (ans1+) / ;
      if(ans1 <= ans2 * )r=mid;
      else l=mid+;
      }
      if(!fg)printf("%d %d\n",ans2,sub[l]);
      }
      return ;
      }

      THUSC2017D1T1

【THUSC2017】巧克力的更多相关文章

  1. [THUSC2017]巧克力[斯坦纳树、随机化]

    题意 题目链接 分析 对于第一问,如果颜色数量比较少的话可以 \(\binom{cnt}{k}\) 枚举最终连通块中的 \(k\) 种颜色,然后利用斯坦纳树求解. 如果颜色比较多,考虑将所有的颜色重新 ...

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

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

  3. THUSC2017 Day1题解

    THUSC2017 Day1题解 巧克力 题目描述 "人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道." 明明收到了一大块巧克力,里面有若干小块,排成n行m列.每一小块都有 ...

  4. THUSC2017题解

    THUSC2017题解 题目都是在LOJ上交的. chocolate LOJ#2977巧克力 这题看着就让人想起了百度之星复赛的\(T5\),就是这题. 因为种类的个数很多,所以把每个种类随意\(ra ...

  5. Bzoj2850 巧克力王国

    Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 505  Solved: 204 Description 巧克力王国里的巧克力都是由牛奶和可可做成的.但 ...

  6. C Golden gun的巧克力

    Time Limit:1000MS  Memory Limit:65535K 题型: 编程题   语言: 无限制 描述 众所周知,13级有尊大神Golden gun,人称根叔,简称金枪!众立志进校队的 ...

  7. 分巧克力【来源:CSDN线上编程挑战赛】——递归,费波那奇数列,迭代

    /*====================================================================== 儿童节快到了,班长想要给班上的每个同学给一个巧克力, ...

  8. Luogu P2183 巧克力

    题目描述 佳佳邀请了M个同学到家里玩.为了招待客人,她需要将巧克力分给她的好朋友们.她有N(1<=N<=5000)块巧克力,但是大小各不一样,第i块巧克力大小为为1*Xi(1<=i& ...

  9. BZOJ2820 - 巧克力王国

    原题链接 Description 给出个二维平面上的点,第个点为,权值为.接下来次询问,给出,求所有满足的点的权值和. Solution 对于这个点建一棵k-d树,子树维护一个子树和. 如果子树所代表 ...

随机推荐

  1. 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...

  2. MariaDB远程连接问题

    MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...

  3. tee命令详解

    基础命令学习目录首页 参考:http://man.linuxde.net/tee tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重 ...

  4. WPF 自定义 MessageBox (相对完善版 v1.0.0.6)

    基于WPF的自定义 MessageBox. 众所周知WPF界面美观.大多数WPF元素都可以简单的修改其样式,从而达到程序的风格统一.可是当你不得不弹出一个消息框通知用户消息时(虽然很不建议在程序中频繁 ...

  5. PSP总结报告1

    回答作业问题 1.回想一下你曾经对计算机专业的畅想 我高考后报考的是计算机科学与技术,当时对计算机技术基本了解为零,当时以为什么东西都会用到计算机,学计算机以后不会找不到工作,刚开学的时候对计算机一窍 ...

  6. YQCB绩效表

    标准 队员 工作质量 20% 工作态度 20% 工作量 30% 工作难易程度 20% 团队意识 10% 总分 陈美琪 17 18 28 19 9 91 张晨阳 16 16 25 17 9 83 刘昭为 ...

  7. 图文转换NABCD

    作为图文转化还是有很多优点的,在这里我就分析一下它的方便快捷 Need:有些非电子版的文字不方便我们编辑,图文转换可以轻而易举达到目的. Approach:现在技术手段应该还有点难度,应该可以换个方法 ...

  8. b5

    吴晓晖(组长) 过去两天完成了哪些任务 完善推荐算法 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成了哪些任务: 修改原型,整理背景 明日计 ...

  9. Maven3 用Maven创建第一个web项目(2)servlet演示

    上一章用Maven新建了web项目成功后,本文演示在此基础上应用servlet. 1.首先修改pom.xml文件,添加servlet依赖 <project xmlns="http:// ...

  10. Teamwork(The second day of the team)

    梦之翼 5.20工作汇报: Master:杨灵超 产品负责人:杨家安 第一次Sprint的目标和时间: 目标:这一次的sprint我们想先做成一个可以运行的可以展示,但是功能或许还不是很完善的一个模型 ...