题目

  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的作用其实就是能产生贡献的方块的左上角的坐标个数

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

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath> using namespace std; typedef long long ll; const ll M=; struct node
{
ll h,x;
} stk[M]; ll n,m;
ll mp[M][M];
ll pre[M*M][M],ppre[M*M][M]; //i,j the row of color=i, in col=j
ll lstk;
double ans; void init()
{
ans=;
memset(pre,,sizeof(pre));
memset(ppre,,sizeof(ppre));
} //calcu the num of appropriate matrix whose buttom is row x, from col li to col ri,
ll calcu(ll li,ll ri,ll x,ll y,ll clr)
{
node p;
ll k,tmp=;
ll ret=;
lstk=;
for(k=li;k<=ri;k++)
{
if(pre[clr][k]==x && k>=y)
p.h=x-ppre[clr][k];
else
p.h=x-pre[clr][k];
p.x=;
if(p.h==)
{
tmp=;
lstk=;
continue;
}
while(lstk> && stk[lstk].h>p.h)
{
tmp-=stk[lstk].h*stk[lstk].x;
p.x+=stk[lstk--].x;
}
stk[++lstk]=p;
tmp+=p.h*p.x;
ret+=tmp;
}
return ret;
} void solve()
{
ll i,j;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
ppre[mp[i][j]][j]=pre[mp[i][j]][j];
pre[mp[i][j]][j]=i;
}
for(j=;j<=m;j++)
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]));
}
ans=ans*/(1ll*n*m*(n+)*(m+));
printf("%.9lf\n",ans);
} int main()
{
ll i,j,T;
cin>>T;
while(T--)
{
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
scanf("%lld",&mp[i][j]);
init();
solve();
}
return ;
}

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. SQL Pretty Printer for SSMS 很棒的格式化插件

    SQL Pretty Printer for SSMS 很不错的SQL格式化插件   写SQL语句或者脚本时,看到凌乱的格式就头大了,于是决心找一款SQL语句格式化的工具. 功夫不负有心人还真的被我找 ...

  2. python 下安装pymysql应用

    前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持3.x版本. 本文测试python版本:2.7.11. ...

  3. C++类的对象和类的指针的区别

    #include <iostream> #include <string> using namespace std; class Student { public: stati ...

  4. echart4数据管理组件dataset学习

    背景 如果后台数据固定,如何动态定制其前端数据展示方式呢?也就是说同一种数据,如何被多个前端Echarts图表复用呢?最近在研究一种数据展示可配置化的功能,然后发现了echart4.0的dataset ...

  5. 怎样使用 v-html 指令?

    v-html 可以在目标节点位置内部插入 html 子节点, 跟节点的 .innerHTML 属性类似, 使用方法如下: <!DOCTYPE html> <html lang=&qu ...

  6. mysql 8.x 登陆提示 Access denied for user 'root'@'localhost' (using password: YES)

    第一步:修改 /etc/mysql/my.cnf. 在[mysql]下添加skip-grant-table:重启. 第二步:通过mysql命令登陆: flush privileges; use mys ...

  7. 【原创】大叔经验分享(62)kudu副本数量

    kudu的副本数量是在表上设置,可以通过命令查看 # sudo -u kudu kudu cluster ksck $master ... Summary by table Name | RF | S ...

  8. 文件下载不可以使用ajax

    参看网站:https://blog.csdn.net/fan510988896/article/details/71520390 总结一下为什么下载请求不能放在ajax里发送: 原因:因为respon ...

  9. js点击发送验证码 xx秒后重新发送

    用于一些注册类的场景,点击发送验证码,xx秒后重新发送. 利用 setTimeout 方法,xx秒后执行指定的方法,修改button的属性值,disabled为true时为灰色,不可点击. <! ...

  10. centos7常见问题(更新。。。)

    1.网络设置 装好CentOS7后,我们一开始是上不了网的 DHCP 这时候,可以输入命令dhclient,可以自动获取一个IP地址,再用命令ip addr查看IP 不过这时候获取的IP是动态的,下次 ...