题意:对于一个n*m的方格,每个格子中都包含一种颜色,求出任意一个矩形包含不同颜色的期望。

思路:

啊啊啊啊啊,补了两天,总算A了这道题了,简直石乐志,前面的容斥还比较好写,后面的那个>13那个最开始思路错了,然后
竟然只有一组样例没有过???? 然后以为是哪里写挂爆long long了。后来想了好久,明明思路完全就是错的! 最开始想的
是直接找那个值的外围的就好了, 忽略了里面的,然后其实问题是转化成在01矩阵中找全1矩阵的个数,本来兴冲冲的写了一发,
发现和正方形DP不是一个东西。。。。 感觉和求最大1矩阵类似,然后看解法,发现网上的都是n^3的?不过好像这两个本来就
不是一个东西,标程上面的写法看不懂= = ,百度也一堆什么单调栈,暴力排序什么的,感觉和题解的不一样,然后就石乐志。
今天又来老老实实的模拟他的过程,这TM还不是维护一个单调栈????石乐志 石乐志。
感觉单调栈真的厉害呀,栈维护的是一个递增的高度,然后通过b数组来维护当前高度的宽度,然后就可以求得以(i,j)结尾的
全1子矩阵的个数。

官方题解:

 每种数可以单独算出其期望然后相加 对于数量小于13的数,可以用容斥的方式来做 对于大于13的数,可以求出全不含的矩阵个数,然后用全部矩阵减去这部分 复杂度 o(n^4/13*T)

代码:

/** @xigua */
#include <stdio.h>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <cstring>
#include <queue>
#include <set>
#include <string>
#include <map>
#include <climits>
#define PI acos(-1)
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 1e4 + 5;
const ll mod = 1ll<<32;
const int INF = 1e8 + 5;
const ll inf = 1e15 + 5;
const db eps = 1e-6;
int mapp[105][105];
struct pos {
ll x, y;
}; ll get(ll x1, ll x2, ll y1, ll y2) {
ll x = x2 - x1 + 1, y = y2 - y1 + 1;
return x * (x + 1) / 2 * y * (y + 1) / 2;
} ll gao(int val, int n, int m) {
ll dp[105][105] = {0};
ll ans = 0;
for (int i = 1; i <= n; i++) {
ll sum = 0, a[105], b[105], cnt = 0;
for (int j = 1; j <= m; j++) {
if (mapp[i][j] == val)
dp[i][j] = 0;
else dp[i][j] = dp[i-1][j] + 1;
int tmp = 1;
while (cnt && a[cnt] > dp[i][j]) {
sum -= a[cnt] * b[cnt];
tmp += b[cnt]; // a维护高度,b维护宽度
cnt--;
}
cnt++;
a[cnt] = dp[i][j];
b[cnt] = tmp;
sum += a[cnt] * b[cnt];
ans += sum;
}
}
return ans;
} void solve() {
ll n, m;
cin >> n >> m;
vector<pos> g[maxn];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", mapp[i] + j);
g[mapp[i][j]].push_back((pos){i, j});
}
}
ll tot = 0, all = n * (n + 1) / 2 * m * (m + 1) / 2; //所有矩阵的总数
for (int i = 0; i < n * m; i++) {
if (g[i].size() <= 13) {
for (int st = 1; st < (1<<g[i].size()); st++) {
ll xl = n + 1, xr = 0, yl = m + 1, yr = 0;
int num = 0;
for (int j = 0; j < g[i].size(); j++) {
if ((1<<j) & st) {
pos tmp = g[i][j]; num++;
xl = min(xl, tmp.x); xr = max(xr, tmp.x);
yl = min(yl, tmp.y); yr = max(yr, tmp.y);
}
}
//容斥
if (num & 1) tot += (ll) xl * yl * (n - xr + 1) * (m - yr + 1);
else tot -= (ll) xl * yl * (n - xr + 1) * (m - yr + 1);
}
}
else {
tot += all - gao(i, n, m);
}
}
printf("%.9f\n", (db)tot / (db)(all));
} int main() {
int t = 1, cas = 1;
//freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d", &t);
while(t--) {
// printf("Case %d: ", cas++);
solve();
}
return 0;
}

  

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 5768 Lucky7 (中国剩余定理+容斥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5768 给你n个同余方程组,然后给你l,r,问你l,r中有多少数%7=0且%ai != bi. 比较明显 ...

  3. hdu 6390 欧拉函数+容斥(莫比乌斯函数) GuGuFishtion

    http://acm.hdu.edu.cn/showproblem.php?pid=6390 题意:求一个式子 题解:看题解,写代码 第一行就看不出来,后面的sigma公式也不会化简.mobius也不 ...

  4. HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

    题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...

  5. hdu 4336 Card Collector —— Min-Max 容斥

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4336 bzoj 4036 的简单版,Min-Max 容斥即可. 代码如下: #include<cst ...

  6. hdu 6052 To my boyfriend

    题目 OvO click here http://acm.hdu.edu.cn/showproblem.php?pid=6052 (2017 Multi-University Training Con ...

  7. HDU 6397 Character Encoding (组合数学 + 容斥)

    题意: 析:首先很容易可以看出来使用FFT是能够做的,但是时间上一定会TLE的,可以使用公式化简,最后能够化简到最简单的模式. 其实考虑使用组合数学,如果这个 xi 没有限制,那么就是求 x1 + x ...

  8. GCD HDU - 1695 (欧拉 + 容斥)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 5656 CA Loves GCD (容斥)

    题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...

随机推荐

  1. dataTables使用ajax请求显示数据

    dataTables是一种很好用前端表格显示库.当加载大量数据时,可以用Ajax 获取数据来提高效率,增速网页加载速率.下面以一个例子作示范. 首先,需要下载jQuery以及dataTables库.这 ...

  2. C#基础:对委托的简单理解

    在编程过程中,我们习惯把数据作为参数传递给方法(例:int a=int.Parse(“20”);).是否能将一个方法传递给另一个方法呢?是不是听起来有点奇怪!!! 线程大家应该熟悉吧,在计算机中并行运 ...

  3. lightoj1062【几何(二分)】

    其实就应该想到,哪有那么简单让你直接搞出答案的几何题啊:(而且很有可能是二分? 题意: 有两个梯子,一个靠在左边墙上,一个靠在右边墙上,长度分别为 x 和 y,他们的交点距离地面高度是 c,求两个梯子 ...

  4. Lightoj1000【简单A+B】

    balababalabalabala! #include<stdio.h> #include<queue> #include<string.h> #include& ...

  5. XHTML学习笔记 Part4:列表

    1. 空格 如果在两个单词中间放置几个连续的空格,默认情况下只会显示一个空格,这种情况成为空格折叠.同样,如果在源文档中开始一个新行,或者放置多个连续的空行,则这些新行将被忽略并被处理为一个空格.对制 ...

  6. typescript学习笔记(一)----基础类型

    1.使用typescript前第一个操作就是全局配置typescript环境 ---------------npm install -g typescript 2.typescript(以下称为ts, ...

  7. MySQL习题1 一对多实例 产品和分类

    /* 需求:建立产品和分类表 1.查询每种分类的产品数量,没有产品的分类也要统计.(cname,quantity) 2.根据分类名称查询分类中的所有产品 */ -- ----------------- ...

  8. 关于maven+springmvc+mybits搭建的框架clean,build后错误:org.apache.ibatis.binding.BindingException的处理

    1.错误原型截图: 2.我对错误的处理轨迹: a.首先,可能是我的mapper.xml配置错了,但是经过查看发现mybits.xml配置如下: 我项目的目录结构如下: 初次判断mybits的配置没有问 ...

  9. djangoXadmin

    是一个基于admin二次开发的开源组件,但是貌似已经停止开发了. 安装方式:(py3.6,django2.1) 1 先用pip安装xadmin2,它会安装xadmin和一些依赖包 2 用pip卸载xa ...

  10. Day2课后作业:购物车简单版

    PRODUCT_LIST = [ ['iphone7',6500], ['macbook',12000], ['pythonbook',66], ['bike',999], ['coffee',31] ...