hdu 6052 To my boyfriend
题目
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的更多相关文章
- HDU 6052 - To my boyfriend | 2017 Multi-University Training Contest 2
说实话不是很懂按题解怎么写,思路来源于 http://blog.csdn.net/calabash_boy/article/details/76272704?yyue=a21bo.50862.2018 ...
- HDU 6052 To my boyfriend(悬线法)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6052 [题目大意] 给出一个数字矩阵,求子矩阵期望数字种数 [题解] 我们统计[x,y]为其所表示 ...
- HDU 6052 To my boyfriend(概率 贡献)
To my boyfriend Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 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: ...
- HDU 6052 To my boyfriend(容斥+单调栈)
题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望. 思路: 啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个 ...
- hdu 6053(To my boyfriend)
-----------题目链接------------- 题目描述: 给定一个矩阵,定义\(f(A)\) 为矩阵中不同元素的个数.现在要求\(f(A)\)的期望. 解法: 首先来暴力的,复杂度大约:\ ...
- HDU 6052
题意略. 思路:我们单独考虑每种颜色的贡献,颜色c对答案的贡献 == 含有c的矩形个数,这就是在考查我们计数的能力,暴力可过. #include<bits/stdc++.h> #defin ...
- ACM里的期望和概率问题 从入门到精通
起因:在2020年一场HDU多校赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有X,Y ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
随机推荐
- MySql查看时间
select now();命令查看MySql时间(包括时分秒) select current_date();命令查看MySql时间(不包括时分秒) 在代码中,创建时间.修改时间字段的jdbc语句也可以 ...
- TCP的粘包、半包和Netty的处理
参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 什么是粘包和半包 在客户端发送数据时,实际是把数据写入到了TCP发送 ...
- 第k大异或值
这道题与2018年十二省联考中的异或粽子很相像,可以算作一个简易版: 因为这不需要可持久化: 也就是说求任意两个数异或起来的第k大值: 首先把所有数放进trie里. 然后二分答案,枚举每个数,相应地在 ...
- django CBV装饰器 自定义django中间件 csrf跨站请求伪造 auth认证模块
CBV加装饰器 第一种 @method_decorator(装饰器) 加在get上 第二种 @method_decorator(login_auth,name='get') 加在类上 第三种 @met ...
- 【hash+二分】Antisymmetry
[题目链接] https://loj.ac/problem/2452 [参考博客] https://blog.csdn.net/xgc_woker/article/details/82904631 [ ...
- k8s-部署及介绍
Kubernetes主要功能: 数据卷 Pod中容器之间共享数据,可以使用数据卷. 应用程序健康检查 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性. 复制应用程序 ...
- hdu 6025(女生赛)
典型的用空间换取时间的思想 关键要理解多个数怎么算最小公倍数 用一个前缀 一个后缀 然后枚举去掉的点就可以了 #include <iostream> #include <cstdio ...
- springboot指定redis库编号配置实现
yml配置 spring: redis: database: #shiro host: 127.0.0.1 port: timeout: password: null redis-cache: dat ...
- 进阶Java编程(10)反射与简单Java类
1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...
- Windows+Nginx+Tomcat整合的安装与配置学习笔记
以下全部是nginx在window7下运行的: nginx学习总结: 我的是放在F盘 1.启动:F:\nginx-1.10.2\nginx-1.10.2>start nginx.exe(找到相应 ...