第二场 hdu 6052 To my boyfriend

Dear Liao

I never forget the moment I met with you. You carefully asked me: "I have a very difficult problem. Can you teach me?". I replied with a smile, "of course". You replied:"Given a matrix, I randomly choose a sub-matrix, what is the expectation of the number of **different numbers** it contains?"

Sincerely yours, 
Guo

InputThe first line of input contains an integer T(T≤8) indicating the number of test cases. 
Each case contains two integers, n and m (1≤n, m≤100), the number of rows and the number of columns in the grid, respectively. 
The next n lines each contain m integers. In particular, the j-th integer in the i-th of these rows contains g_i,j (0≤ g_i,j < n*m).OutputEach case outputs a number that holds 9 decimal places.Sample Input

1
2 3
1 2 1
2 1 2

Sample Output

1.666666667

Hint

6(size = 1) + 14(size = 2) + 4(size = 3) + 4(size = 4) + 2(size = 6) = 30  / 18 = 6(size = 1) + 7(size = 2) + 2(size = 3) + 2(size = 4) + 1(size = 6)

题目大意:给你n行m列的二维数组,数组中的每一个数值表示颜色。问二维数组构成的矩形中有不同的颜色和除以二维数组构成的不同矩形数

解题思路:首先要算出一个颜色的不同上下左右边界,假定下边界固定了。然后求出上边界,如果上边界的相同位置和本身的颜色相同就结束这个搜索,当i==x是只要求出左边界就行了。最后求出左边界和右边界算出矩阵的个数即可。枚举二维数组中中每一颜色加和就能得到二维数组构成的矩形中有不同的颜色和。
二维数组构成的不同矩形数=n*(n+1)*m*(m+1)/4
AC代码:

 1 #include <iostream>
 2 #include <bits/stdc++.h>
 3 #define LL long long
 4 using namespace std;
 5 int n,m;
 6 LL color[105][105];
 7 LL count(int x,int y)
 8 {
 9     LL res=0;
10     int L=1,R=m,c=color[x][y];
11     for(int i=x;i>=1;i--)
12     {
13         if(i<x&&c==color[i][y]) break;
14         int l=y,r=y;
15         for(int j=y-1;j>=max(1,L);j--)
16         {
17             if(c==color[i][j]) break;
18             l=j;
19         }
20         L=max(L,l);
21         if(i==x)
22         {
23             res+=(LL)(n-x+1LL)*(y-L+1LL)*(R-y+1LL);
24             continue;
25         }
26         for(int j=y+1;j<=min(R,m);j++)
27         {
28             if(c==color[i][j]) break;
29             r=j;
30         }
31         R=min(R,r);
32         res+=(LL)(n-x+1LL)*(y-L+1LL)*(R-y+1LL);
33     }
34     return res;
35 }
36 int main()
37 {
38     int t;
39     while(~scanf("%d",&t))
40     {
41         while(t--)
42         {
43             scanf("%d%d",&n,&m);
44             LL ss=n*(n+1)/2*m*(m+1)/2;
45             for(int i=1;i<=n;i++)
46             {
47                 for(int j=1;j<=m;j++)
48                 {
49                     scanf("%lld",&color[i][j]);
50                 }
51             }
52             LL ans=0;
53             for(int i=1;i<=n;i++)
54             {
55                 for(int j=1;j<=m;j++)
56                 {
57                     //printf("%lld\n",count(i,j));
58                     ans+=count(i,j);
59                 }
60             }
61             //printf("%lld %lld\n",ans,ss);
62             printf("%.9f\n",ans*1.0/ss);
63         }
64     }
65     return 0;
66 }

				
时间: 2024-08-28 15:34:20

第二场 hdu 6052 To my boyfriend的相关文章

hdu 6052 - To my boyfriend

题目 OvO click here http://acm.hdu.edu.cn/showproblem.php?pid=6052 解 分开考虑每种颜色 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])-ca

HDU-DuoXiao第二场hdu 6315 Naive Operations 线段树

hdu 6315 题意:对于一个数列a,初始为0,每个a[ i ]对应一个b[i],只有在这个数字上加了b[i]次后,a[i]才会+1. 有q次操作,一种是个区间加1,一种是查询a的区间和. 思路:线段树,一开始没用lazy,TLE了,然后开始想lazy的标记,这棵线段树的特点是,每个节点维护 :一个区间某个a 要增加1所需个数的最小值,一个区间已加上的mx的最大值标记,还有就是区间和sum. (自己一开始没有想到mx标记,一度想把lazy传回去. (思路差一点就多开节点标记. #include

2019 HDU 多校赛第二场 HDU 6598 Harmonious Army 构造最小割模型

题意: 有n个士兵,你可以选择让它成为战士还是法师. 有m对关系,u和v 如果同时为战士那么你可以获得a的权值 如果同时为法师,你可以获得c的权值, 如果一个为战士一个是法师,你可以获得b的权值 问你可以获得的最大权值是多少? 题解: 对每个士兵建立一个点x ,点x 向源点s 连一条边,向汇点t 连一条边, 分别表示选择两种职业,然后就可以先加上所有的贡献,通过两点关系用 最小割建模,如下图所示 设一条边的三种贡献为A, B, C,可以得到以下方程: 如果x,y都是法师,你可以获得C的权值,但是

HDU 5742 It&#39;s All In The Mind (贪心) 2016杭电多校联合第二场

题目:传送门. 题意:求题目中的公式的最大值,且满足题目中的三个条件. 题解:前两个数越大越好. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } int main() { int t; ci

百度之星2014初赛第二场

A. Scenic Popularity http://acm.hdu.edu.cn/showproblem.php?pid=4831 思路:景点区会控制休息区的Hot值,我们建立休息区到它最近的景点区的关系,注意处理冲突. 查询和修改都暴力进行,预处理关系,从左到右,然后从右到左遍历一遍即可,更新时候,从被修改的p位置,向两边,与p有关的休息区进行更新.总的时间复杂度O(T*n*K),10^8左右,不到1s可以解决. const int maxn = 10000; const int maxh

【补题】组队训练第二场 &amp; 个人训练第一场

组队第二场: C题 CodeForces Gym 100735D 题意:给你N个木棍,问他们能拼成多少个三角形. 思路:从小到大排序,然后贪心地去取. 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<vector> 7 #include<set> 8

多校第六场 HDU 4927 JAVA大数类

题目大意:给定一个长度为n的序列a,每次生成一个新的序列,长度为n-1,新序列b中bi=ai+1?ai,直到序列长度为1.输出最后的数. 思路:这题实在是太晕了,比赛的时候搞了四个小时,从T到WA,唉--对算组合还是不太了解啊,现在对组合算比较什么了-- import java.io.*; import java.math.*; import java.util.*; public class Main { public static void main(String[] args) { Sca

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神 (一)体面 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: 从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7

HDU多校赛第9场 HDU 4965Fast Matrix Calculation【矩阵运算+数学小知识】

难度上,,,确实,,,不算难 问题是有个矩阵运算的优化 题目是说给个N*K的矩阵A给个K*N的矩阵B(1<=N<=1000 && 1=<K<=6),先把他们乘起来乘为C矩阵,然后算C^(N*N) 相当于 ABABABABABABAB...=(AB)^(N*N) 不如 A(BA)^(N*N-1)B 因为BA乘得K*K的矩阵,K是比较小的 #include <cstdio> #include <cstdlib> #include <cstr