题目

题目

做法

  • 考虑部分数据(颜色较少)的:

二分中位数\(mid\),将\(v[i]=1000+(v[i]>mid)\)

具体二分操作:然后求出包含\(K\)种颜色的联通快最小的权值和,判断该权值和是否满足中位数为\(mid\),从而调整范围

其中求权值和显然可以用斯坦纳树解决

  • 正解:

我们每次随机把颜色映射到\([0,K)\)中去,每次得到的结果正确率就为答案联通块的离散颜色正好一一对应的概率:\(\frac{K!}{K^K}\)

随机\(233\)次,有\(99\%\)以上的正确率

Code

  1. #include<bits/stdc++.h>
  2. #include<queue>
  3. typedef int LL;
  4. const LL dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
  5. const LL maxn=7e4+9,inf=1e8;
  6. inline LL Read(){
  7. LL x=0,f=1; char c=getchar();
  8. while(c<'0'||c>'9'){
  9. if(c=='-') f=-1; c=getchar();
  10. }
  11. while(c>='0'&&c<='9'){
  12. x=(x<<3)+(x<<1)+c-'0',c=getchar();
  13. }
  14. return x*f;
  15. }
  16. std::queue<LL> que;
  17. LL n,m,T,K,C,tot;
  18. LL f[maxn][109],c[maxn],sta[maxn],d[maxn][2],a[maxn],pos[255][255],v[maxn],hs[maxn];
  19. inline bool Ok(LL x,LL y){
  20. return x>=1 && x<=n && y>=1 && y<=m;
  21. }
  22. inline void Spfa(LL bit){
  23. for(LL i=1;i<=tot;++i) if(c[i]!=-1) que.push(i);
  24. while(que.size()){
  25. LL now(que.front()); que.pop();
  26. LL x(d[now][0]),y(d[now][1]);
  27. for(LL i=1;i<=4;++i){
  28. LL xx(x+dx[i]),yy(y+dy[i]),to(pos[xx][yy]);
  29. if(!Ok(xx,yy) || c[to]==-1) continue;
  30. if(f[to][bit]>f[now][bit]+a[to]){
  31. f[to][bit]=f[now][bit]+a[to];
  32. que.push(to);
  33. }
  34. }
  35. }
  36. }
  37. inline LL Solve(LL up){
  38. for(LL i=0;i<up;++i)
  39. for(LL j=1;j<=tot;++j)
  40. f[j][i]=inf;
  41. for(LL i=1;i<=tot;++i) if(c[sta[i]]!=-1) f[i][1<<hs[c[i]]]=a[i];
  42. for(LL bit=1;bit<up;++bit){
  43. for(LL i=1;i<=tot;++i){
  44. LL x(i);
  45. if(c[x]==-1) continue;
  46. for(LL bit1=(bit-1)&bit;bit1;bit1=(bit1-1)&bit)
  47. f[x][bit]=std::min(f[x][bit],f[x][bit1]+f[x][bit-bit1]-a[x]);
  48. }
  49. Spfa(bit);
  50. }
  51. LL ans(inf);
  52. for(LL i=1;i<=tot;++i) ans=std::min(ans,f[i][up-1]);
  53. return ans;
  54. }
  55. int main(){
  56. srand(time(NULL));
  57. T=Read();
  58. while(T--){
  59. n=Read(); m=Read(); K=Read(); tot=0;
  60. sta[0]=0;
  61. C=0;
  62. for(LL i=1;i<=n;++i)
  63. for(LL j=1;j<=m;++j){
  64. pos[i][j]=++tot;
  65. d[tot][0]=i; d[tot][1]=j;
  66. }
  67. for(LL i=1,now=0;i<=n;++i)
  68. for(LL j=1;j<=m;++j){
  69. LL col(Read());
  70. c[++now]=col;//col
  71. C=std::max(C,col);
  72. }
  73. for(LL i=1,now=0;i<=n;++i)
  74. for(LL j=1;j<=m;++j)
  75. v[++now]=Read();//val
  76. LL up(1<<K),ans1(inf),ans2(inf);
  77. for(LL i=1;i<=233;++i){
  78. for(LL j=1;j<=C;++j) hs[j]=rand()%K;
  79. LL l(0),r(1000000),a1(inf),a2(inf);
  80. while(l<=r){
  81. LL mid(l+r>>1);
  82. for(LL i=1;i<=tot;++i) a[i]=(c[i]==-1?inf:1000+(v[i]>mid));
  83. LL now(Solve(up));
  84. if(now==inf) break;
  85. a1=now/1000;
  86. LL small(a1-(now-a1*1000));
  87. if(small>=(a1+1>>1)){
  88. a2=mid; r=mid-1;
  89. }else l=mid+1;
  90. }
  91. if(a1<ans1 || (a1==ans1 && a2<ans2)){
  92. ans1=a1; ans2=a2;
  93. }
  94. }
  95. if(ans1==-1) puts("-1 -1");
  96. else printf("%d %d\n",ans1,ans2);
  97. }
  98. return 0;
  99. }

LOJ#2977. 「THUSCH 2017」巧克力(斯坦纳树+随机化)的更多相关文章

  1. @loj - 2977@ 「THUSCH 2017」巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...

  2. LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树

    题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...

  3. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  4. loj2977 巧克力 (斯坦纳树+随机化)

    考虑颜色比较少的时候,第一问可以直接斯坦纳树 第二问考虑二分,每次把每格的权值给成1000+[a[i]>m],就是在个数最少的基础上尽量选小于等于m的 然而颜色太多不能直接做,但可以把每种颜色映 ...

  5. LOJ #2978「THUSCH 2017」杜老师

    听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...

  6. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

    题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...

  7. LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论

    题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...

  8. loj#2978. 「THUSCH 2017」杜老师(乱搞)

    题面 传送门 题解 感谢yx巨巨 如果一个数是完全平方数,那么它的所有质因子个数都是偶数 我们把每一个数分别维护它的每一个质因子的奇偶性,那么就是要我们选出若干个数使得所有质因子的个数为偶数.如果用线 ...

  9. 「THUSCH 2017」大魔法师 解题报告

    「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...

随机推荐

  1. javascript 之 Object.defineProperty

    语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...

  2. SQL case when 遇到null值

    case  when f.FPH is  NULL then a.HSJE else f.KPHSJE  end    yes case f.FPH  when   NULL then a.HSJE ...

  3. JS基础篇【1】

    该文讲解适用于有一定语言开发基础的朋友们,亦可当作久别重逢之回顾! 1.JS简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记 ...

  4. 用Jmeter做性能测试,之后报表展示

    https://octoperf.com/blog/2017/10/19/how-to-analyze-jmeter-results/ 看到性能测试平台的开发,我在想需要什么功能,报表需要什么样子的 ...

  5. 用js刷剑指offer(二叉搜索树的后序遍历序列)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...

  6. ubuntu18 搭建ftp服务器,以及文件目录权限问题

    有时候呢我们有一台本地的台式机或者云服务器,我们想要搭个ftp服务器好让我们在内网/外网中方便的传输.保存文件,这样别的任何电脑啊,设备啊,只要访问这个ftp的地址,就可以进行文件传输啦!由于我现在台 ...

  7. ES6 解构赋值详解

    解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...

  8. ResNet网络的Pytorch实现

    1.文章原文地址 Deep Residual Learning for  Image Recognition 2.文章摘要 神经网络的层次越深越难训练.我们提出了一个残差学习框架来简化网络的训练,这些 ...

  9. 系统间HTTP调用代码封装

    痛点 最近接手一个老项目,这个项目几经转手,到我这里时,发现代码的可阅读性实在是很差,对于一个有点代码洁癖的我来说,阅读起来实在是很难受.其中一个痛点,现在就拉出来讲讲.该项目需要与另外一个项目进行业 ...

  10. 微服务,开源 RPC 框架 - Spring Cloud

    Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言 Spring Cloud 利用 Spring Boot 特性整合了开源行业中优秀的组 ...