题目

  OvO click here http://acm.hdu.edu.cn/showproblem.php?pid=6052

  (2017 Multi-University Training Contest - Team 2 - 1008)

  分开考虑每种颜色

  pre[i][j]代表第j列最近一个i颜色的行数,ppre是次近

  calcu(li,ji,x,y,clr)表示从col=li到col=ri,计算(x,y)点对mp[x][y]=clr颜色有贡献的矩形的个数(其实并不是,准确说是(n-i+1)*(calcu(1,m,i,j,mp[i][j])-calcu(1,j-1,i,j,mp[i][j])-calcu(j+1,m,i,j,mp[i][j]))才是有贡献的矩形的个数)

  记每个子矩阵中,对于每种颜色,记最上(同层则最左)的那个点对该矩阵该颜色有贡献.

  接下来然后搜索每个点,对于每个点用单调栈计算合法矩阵个数,对于点(i,j)就是前文提过的(n-i+1)*(calcu(1,m,i,j,mp[i][j])-calcu(1,j-1,i,j,mp[i][j])-calcu(j+1,m,i,j,mp[i][j]))

  calcu函数中,对于每个扫到的列,如果它的高度小于当前栈顶的高度,那么把栈顶的元素弹出来,并且把宽度加到当前这个列中。因为栈中超出当前列的高度的那部分已经不会再对矩形个数产生贡献。

  calcu中tmp的作用其实就是能产生贡献的方块的左上角的坐标个数

  (本思路来自某其他博客)

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. typedef long long ll;
  10.  
  11. const ll M=;
  12.  
  13. struct node
  14. {
  15. ll h,x;
  16. } stk[M];
  17.  
  18. ll n,m;
  19. ll mp[M][M];
  20. ll pre[M*M][M],ppre[M*M][M]; //i,j the row of color=i, in col=j
  21. ll lstk;
  22. double ans;
  23.  
  24. void init()
  25. {
  26. ans=;
  27. memset(pre,,sizeof(pre));
  28. memset(ppre,,sizeof(ppre));
  29. }
  30.  
  31. //calcu the num of appropriate matrix whose buttom is row x, from col li to col ri,
  32. ll calcu(ll li,ll ri,ll x,ll y,ll clr)
  33. {
  34. node p;
  35. ll k,tmp=;
  36. ll ret=;
  37. lstk=;
  38. for(k=li;k<=ri;k++)
  39. {
  40. if(pre[clr][k]==x && k>=y)
  41. p.h=x-ppre[clr][k];
  42. else
  43. p.h=x-pre[clr][k];
  44. p.x=;
  45. if(p.h==)
  46. {
  47. tmp=;
  48. lstk=;
  49. continue;
  50. }
  51. while(lstk> && stk[lstk].h>p.h)
  52. {
  53. tmp-=stk[lstk].h*stk[lstk].x;
  54. p.x+=stk[lstk--].x;
  55. }
  56. stk[++lstk]=p;
  57. tmp+=p.h*p.x;
  58. ret+=tmp;
  59. }
  60. return ret;
  61. }
  62.  
  63. void solve()
  64. {
  65. ll i,j;
  66. for(i=;i<=n;i++)
  67. {
  68. for(j=;j<=m;j++)
  69. {
  70. ppre[mp[i][j]][j]=pre[mp[i][j]][j];
  71. pre[mp[i][j]][j]=i;
  72. }
  73. for(j=;j<=m;j++)
  74. ans+=1ll*(n-i+)*(calcu(,m,i,j,mp[i][j])-calcu(,j-,i,j,mp[i][j])-calcu(j+,m,i,j,mp[i][j]));
  75. }
  76. ans=ans*/(1ll*n*m*(n+)*(m+));
  77. printf("%.9lf\n",ans);
  78. }
  79.  
  80. int main()
  81. {
  82. ll i,j,T;
  83. cin>>T;
  84. while(T--)
  85. {
  86. scanf("%lld%lld",&n,&m);
  87. for(i=;i<=n;i++)
  88. for(j=;j<=m;j++)
  89. scanf("%lld",&mp[i][j]);
  90. init();
  91. solve();
  92. }
  93. return ;
  94. }

hdu 6052 To my boyfriend的更多相关文章

  1. HDU 6052 - To my boyfriend | 2017 Multi-University Training Contest 2

    说实话不是很懂按题解怎么写,思路来源于 http://blog.csdn.net/calabash_boy/article/details/76272704?yyue=a21bo.50862.2018 ...

  2. HDU 6052 To my boyfriend(悬线法)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6052 [题目大意] 给出一个数字矩阵,求子矩阵期望数字种数 [题解] 我们统计[x,y]为其所表示 ...

  3. HDU 6052 To my boyfriend(概率 贡献)

    To my boyfriend Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. 2017ACM暑期多校联合训练 - Team 2 1008 HDU 6052 To my boyfriend (数学 模拟)

    题目链接 Problem Description Dear Liao I never forget the moment I met with you. You carefully asked me: ...

  5. HDU 6052 To my boyfriend(容斥+单调栈)

    题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望. 思路: 啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个 ...

  6. hdu 6053(To my boyfriend)

    -----------题目链接------------- 题目描述: 给定一个矩阵,定义\(f(A)\) 为矩阵中不同元素的个数.现在要求\(f(A)\)的期望. 解法: 首先来暴力的,复杂度大约:\ ...

  7. HDU 6052

    题意略. 思路:我们单独考虑每种颜色的贡献,颜色c对答案的贡献 == 含有c的矩形个数,这就是在考查我们计数的能力,暴力可过. #include<bits/stdc++.h> #defin ...

  8. ACM里的期望和概率问题 从入门到精通

    起因:在2020年一场HDU多校赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有X,Y ...

  9. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

随机推荐

  1. 小菜鸟之HTML常用

    html的基本结构是什么? 表示段落标签是什么?<p> 表示标题标签的是什么?<title>Css标签样式</title> 表示区域标签的是什么?<div&g ...

  2. Java中的float、double计算精度问题

    java中的float.double计算存在精度问题,这不仅仅在java会出现,在其他语言中也会存在,其原因是出在IEEE 754标准上. 而java对此提供了一个用于浮点型计算的类——BigDeci ...

  3. Phython-守护线程

    import threading,time def run(n): print("task is ",n) time.sleep(2) print("task done& ...

  4. 7-Perl 数组

    1.Perl 数组Perl 数组一个是存储标量值的列表变量,变量可以是不同类型.数组变量以 @ 开头.访问数组元素使用 $ + 变量名称 + [索引值] 格式来读取,实例如下:#!/usr/bin/p ...

  5. java——多线程知识点大总结

    1:理解线程的概念之前,我们有必要先理解一下进程的概念 程序(Program)是为实现特定目标或解决特定问题而用计算机语言(比如Java语言)编写的命令序列的集合. 进程指一个程序的一次执行过程   ...

  6. GET方法和POST方法的区别,Get方法到底可传递的字符串的最大长度是多少?

    GET方法和POST方法的区别,Get方法到底可传递的字符串的最大长度是多少?曾经人介绍,如果使用GET方式传输参数,URL的最大长度是256个字节,对此深信不疑. 但是最近看到一些超长的url,能够 ...

  7. 连接云服务器中MySql数据库遇到的问题

    使用的免费的云服务器,上面只能下载MySql数据库,不过当云数据库使用绰绰有余了,也就放一些测试数据而已 而且上面只可以部署php项目,.netcore项目部署实现比较麻烦 问题如下: 下载了navi ...

  8. mongo(一)

    入门文章地址:https://blog.csdn.net/muguli2008/article/details/80591256 按下面文件创建好文件下,然后执行下面的命令 mongod --port ...

  9. 【原创】大数据基础之Drill(1)简介、安装及使用

    https://drill.apache.org/ 一 简介 Drill is an Apache open-source SQL query engine for Big Data explorat ...

  10. java字符串大小写转换

    String test="SHA34cccddee";    System.out.println(test.toUpperCase());//小写转大写 String test= ...