转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove

题意:给出一个n*m的矩阵,每次选取一个a*b的矩阵,要求所有元素与最小的元素差的和最小。

http://codeforces.com/problemset/problem/15/D

做法:枚举子矩阵左上角的点,算出值,排序之后,依次取,每取一个,暴力把不能取的点进行标记。

那么就剩下怎么算值。

可以 sigma() - a * b * min() 。

那么子矩阵的和比较常规,sum[i][j]表示以(i,j)为右下角,(1,1)为左上角的矩阵的和。

至于min()用单调队列两次维护一下。

首先对于每一行,维护某一列起,向左b列的最小值。用l[i][j]表示。

然后纵向维护一次单调队列,求出以每个点为右下角的子矩阵的最小值。

到此结束。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <queue>
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
using namespace std;
typedef long long LL;
const int N = 1005;
int n, m, a, b;
LL sum[N][N];
bool vis[N][N];
int num[N][N], l[N][N], rightdown[N][N];
struct Node{int x, y;LL amount;Node(){}Node(int _x,int _y,LL _a):x(_x),y(_y),amount(_a){}bool operator< (const Node &n)const {if (amount != n.amount)return amount < n.amount;if (x != n.x) return x < n.x;return y < n.y;}
};
vector<Node> ans,ret;
int main(){scanf ("%d%d%d%d", &n, &m, &a, &b);for (int i = 1 ; i <= n ; i ++){deque <int> que;while (!que.empty()) que.pop_back();for (int j = 1 ; j <= m ; j ++){scanf ("%d", &num[i][j]);sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + num[i][j];while (!que.empty() && que.front() + b <= j) que.pop_front();while (!que.empty() && num[i][j] < num[i][que.back()]) que.pop_back();que.push_back(j);l[i][j] = num[i][que.front()];}}for (int j = b ; j <= m ; j ++){deque <int> que;while (!que.empty()) que.pop_back();for (int i = 1 ; i <= n ; i ++){while (!que.empty() && que.front() + a <= i) que.pop_front();while (!que.empty() && l[i][j] < l[que.back()][j]) que.pop_back();que.push_back(i);rightdown[i][j] = l[que.front()][j];}}for (int i = 1 ; i + a -1 <= n ; i ++){for (int j = 1 ; j + b - 1 <= m ; j++){LL matrix_sum = sum[i + a - 1][j + b - 1] - sum[i - 1][j + b - 1] - sum[i + a - 1][j - 1] + sum[i - 1][j - 1];ans.push_back(Node(i, j, matrix_sum - (LL)a * b * rightdown[i + a -1][j + b - 1]));}}sort (ans.begin(), ans.end());for (int r = 0 ; r < ans.size() ; r ++){int x = ans[r].x, y = ans[r].y;if (vis[x][y]) continue;ret.push_back(ans[r]);for (int i = max(1, x - a + 1) ; i <= x + a - 1 ; i ++){for (int j = max(1, y - b + 1) ; j <= y + b - 1 ; j++){vis[i][j] = true;}}}printf("%d\n", ret.size());for (int i = 0 ; i < ret.size() ; i ++){printf("%d %d %I64d\n", ret[i].x, ret[i].y, ret[i].amount);}return 0;
}

CF 15D Map相关推荐

  1. 算法——迪克斯特拉算法

    迪克斯特拉算法主要分四个步骤: 找到"最便宜"的节点(可在最短时间内到达的节点). 更新该节点的邻居节点的开销. 重复这个过程,直到对图中每个节点都做了. 计算最终路径. 这个算法 ...

  2. CF #371 (Div. 2) C、map标记

    1.CF #371 (Div. 2)   C. Sonya and Queries  map应用,也可用trie 2.总结:一开始直接用数组遍历,果断T了一发 题意:t个数,奇变1,偶变0,然后与问的 ...

  3. Cf 362div2 C [map暴力,思维能力]

    题目连接 http://codeforces.com/contest/697/problem/C Description Barney lives in NYC. NYC has infinite n ...

  4. CF 990A. Commentary Boxes【数学/模拟】

    [链接]:CF [题意]:对于一个数n,每次加一的代价是a,每次减一的代价是b,求被m整除时的最小代价. [分析]:分情况讨论,自己多举几个栗子. [代码]: #include<cstdio&g ...

  5. [LOJ 6288]猫咪[CF 700E]Cool Slogans

    [LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...

  6. 6月28日 cf总结

    6月28日 cf总结 今天cf提前到10点了,还不如半夜..网速坑啊... A题:水题. 在一个01序列中每次删掉01和10,求最终剩下的序列的长度. 直接输出0的个数和1的个数的差即可,因为最终只要 ...

  7. 2B.处女座与cf(C++)

    处女座与cf(C++) 点击做题网站链接 题目描述 众所周知,处女座经常通过打cf来调节自己的心情.今天处女座又参加了一场cf的比赛,他知道了所有的提交记录,他想知道自己的得分和排在第几名.你知道处女 ...

  8. mahout基于Hadoop的CF代码分析(转)

    来自:http://www.codesky.net/article/201206/171862.html mahout的taste框架是协同过滤算法的实现.它支持DataModel,如文件.数据库.N ...

  9. [工作积累] shadow map问题汇总

    1.基本问题和相关 Common Techniques to Improve Shadow Depth Maps: https://msdn.microsoft.com/en-us/library/w ...

最新文章

  1. 【数据结构】平衡树 - treap
  2. HDLBits 系列(9)Gates and Vector
  3. 【Tools】python环境操作笔记
  4. [验证码识别技术]字符验证码杀手--CNN
  5. Qt中qDebug()技巧初探
  6. Python-字符串格式化
  7. Boost:在OpenCL并将图像渲染为OpenGL中的纹理
  8. 贾扬清撰文详解Caffe2:从强大的新能力到入门上手教程
  9. 前端学习(874):解绑事件兼容方案
  10. html画特殊图形(待修改)
  11. ggplot2中显示坐标轴_qplot()——ggplot2的快速绘图
  12. Facebook要造芯片了,开发团队正在组建中
  13. 谋职中的战术与战略——《程序员求职第一书》书评
  14. AOJ2025 Eight Princes
  15. windows与linux多线程对比
  16. python re span_Python的re模块与正则表达式小结
  17. Java中的静态方法、类方法、成员方法、构造方法、非静态方法,各方法的定义以及个方法的功能详解大全
  18. java留言功能_java web实现简单留言板功能
  19. 使用pyecharts绘制图表
  20. 如何通过微信与手机连接到服务器,本地服务器和微信服务器的具体通信过程是怎样的...

热门文章

  1. 批量替换excel中的换行
  2. 电脑打开计算机 却看不到桌面,电脑提示显示ie浏览器存在电脑上,但是我为什么找不到它的图标?...
  3. 中科大算法第二次课堂测验前20个小时极限复习记录
  4. arcgis导入市级政区图_CityBuilder——导入GIS数据创建三维城市地图
  5. sklearn——主成分分析PCA操作实例
  6. 移动端或ipad自带safari浏览器调试插件vConsole使用
  7. 计算机维护与管理实践报告,计算机维护实习报告.doc
  8. php中问号作用,你肯定不懂(问号和“?”作用大不同)
  9. 钉钉单据对接用友、金蝶
  10. 计算机网络子网的特定主机地址,网络基础之IP地址和子网掩码