题目

  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. Kafka主题体系架构-复制、故障转移和并行处理

    本文讨论了Kafka主题的体系架构,讨论了如何将分区用于故障转移和并行处理. Kafka主题,日志和分区 Kafka将主题存储在日志中.主题日志分为多个分区.Kafka将日志的分区分布在多个服务器或磁 ...

  2. 01-Hadoop概述及基础环境搭建

    1 hadoop概述 1.1 为什么会有大数据处理 传统模式已经满足不了大数据的增长 1)存储问题 传统数据库:存储亿级别的数据,需要高性能的服务器:并且解决不了本质问题:只能存结构化数据 大数据存储 ...

  3. acm java入门(转载)

    ACM中java的使用 http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输入输出 ...

  4. dij 费用流

    #include <bits/stdc++.h> using namespace std; typedef long long lld; const int MAXN = 50010, M ...

  5. # [洛谷1337] 吊打XXX/平衡点 (模拟退火)

    [洛谷1337] 吊打XXX/平衡点 (模拟退火) 题意 n个重物(x,y,w),求平衡时x的位置(x,y) 分析 模拟退火基础题,基于随机数的优化算法,时间复杂度玄学,参数玄学,能不能AC看脸,当然 ...

  6. socket传送文件格式的问题

    在python3中socket传送文件只能传送‘bytes'类型,如下例子: import socket client = socket.socket()client.connect(("l ...

  7. 【IntelliJ IDEA】tomcat启动,打印日志乱码问题 【最新解决方法请看最后附录】

    刚开始给idea上配置了一个tomcat,然后跟着http://wiki.jikexueyuan.com/project/intellij-idea-tutorial/theme-settings.h ...

  8. 【sublime Text】sublime Text3安装可以使xml格式化的插件

    应该有机会 ,会碰到需要格式化xml文件的情况. 例如,修改word转化的xml文件之后再将修改之后的xml文件转化为word文件. 但是,word另存的xml文件是没有格式的一片: 那怎么格式化 这 ...

  9. Linux下安装Jenkins并且发布.net core

    一,基础环境 1,操作系统:CentOS 7.3 2,Docker version 18.09.6 docker安装参考:https://www.cnblogs.com/liuxiaoji/p/110 ...

  10. dev GridView 的组计和分组计

    /// <summary> /// //添加组计 /// </summary> private void SetGroupSummary(GridView gv, string ...