题意:对于一个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;
}

  

转载于:https://www.cnblogs.com/ost-xg/p/7264061.html

HDU 6052 To my boyfriend(容斥+单调栈)相关推荐

  1. HDU 2841 Visible Trees(容斥)题解

    题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...

  2. HDU 6143 Killer Names【容斥定理】【排列组合】

    题目来戳呀 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  3. HDU 6143 Killer Names(容斥+组合)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  4. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

  5. HDU多校1 - 6759 Leading Robots(单调栈)

    题目链接:点击查看 题目大意:n 个机器人在数轴上赛跑,给出每个机器人的起点和加速度,初始速度都为 0 ,问有多少个机器人在赛跑的过程中可以成为最前面的一个 题目分析:又是被zx学长秒掉的一道题,感谢 ...

  6. 【HDU - 3410 】 Passing the Message(单调栈)

    题干: What a sunny day! Let's go picnic and have barbecue! Today, all kids in "Sun Flower" k ...

  7. hdu 5072 Coprime(同色三角形+容斥)

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就 ...

  8. 入门经典_Chap08_题解总结:极角扫描法 滑动窗口 单调队列 单调栈

    总结  本章主要关注一个重要的问题 – 单调队列和单调栈的使用  同时还有一些其他的问题,如扫描法,递归的思想, 构造, 分治, 二分等 知识点 单调队列 和 单调栈 题目 UVA - 1606 Am ...

  9. HDU 6143 Killer Names(排列+容斥,dp)

    Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...

最新文章

  1. 分享10个实用的超绚CSS3按钮设计
  2. C - 数据结构实验之排序三:bucket sort(水题)
  3. 读《台湾码农的心路历程》
  4. asp js单步调试_如何使用Chrome的控制台高效的调试Javascript代码?
  5. php+js 表单过期
  6. E: Malformed line 60 in source list /etc/apt/sources.list (dist parse)
  7. 前端加密js库--CryptoJs
  8. 信号分析与处理 基于matlab认识实验
  9. 反汇编linux内核,如何反汇编linux固件内核
  10. 天下大事,必做于细!
  11. 前端调试技巧2:fiddler能替换h5项目或者APP中的JS或者HTML嘛?
  12. uva 10859 放置街灯--Placing Lampposts
  13. CNN经典分类网络发展历程GoogLeNet、SqueezeNet、ResNet、ResNeXt、DenseNet
  14. 【前端】一、web技术基础
  15. 中小型电子商务网站架构
  16. 发表论文被拒?只因你没注意这几点
  17. 信息系统项目管理师(2022年)—— 重点内容:项目合同管理(13)
  18. 【电源专题】案例:单节18650电池供电的设备在3.6V时候怎么电量就只剩下一格了?
  19. 学软件测试,51Testing和传智播客选哪家?
  20. 命令反查dns,命令ip地址dns反查

热门文章

  1. 使用Sublime Text 3作为Python编辑器有关中文问题
  2. linux 编译C语言代码后产生OBJ文件的方法
  3. 如何高效的利用博客园?
  4. JOGL   java调用openGL
  5. 实现双击IE9的Tab键关闭当前页面的功能
  6. java中获取时间的方式,持续更新
  7. SQLite中的内连接简化技巧
  8. ARP协议全面实战手册——Wireshark的安装第一更
  9. python开发效率最高_公认8个效率最高的爬虫框架
  10. 怎么判断噎到没噎到_怎么判断噎到没噎到